MongoDB 的學習筆記
MongoDB 安裝
Ubuntu 安裝
sudo apt-get install mongodb
Mac 安裝
brew install mongodb
MongoDB 啟動
Ubuntu 啟動方式
1. 啟動服務方式(守護程序方式啟動) (部署ubuntu伺服器的時候基本使用這種方案)
會有的方式,當
看門口狗
閃退的時候,作業系統自動會重新啟動
mongodb
# 啟動
sudo service mongodb start
# 停止
sudo service mongodb stop
2. 直接手動啟動 (挂住終端的形式啟動)
# 啟動
sudo mongod
# 停止
輸入 ctrl + C
注意事項:如果啟動不成功
1. 請注意對預設路徑
是否有通路權限,解決方法使用
/data/db
方式啟動
sudo
- 資料庫的路徑是否存在
,如果不存在就建立
/data/db
Mac 啟動
sudo mongod
mongod 啟動參數說明
--dbpath
設定資料的路徑(如果不傳遞就是
/data/db
)
-f [--config] 配置檔案路徑
啟動時使用配置檔案進行啟動
--fork
守護程序啟動(必須攜帶 –logpath)
--auth
開啟認證權限
指令行用戶端連結
預設連結的IP位址: 127.0.0.1
預設端口: 27017
mongo
認證權限模式
如果沒有啟動
認證權限模式
對所有的資料全部有通路權限
開啟權限
當沒有任何使用者時,預設情況下,第一步先是建立
root
使用者
一旦建立好第一個root賬号以後所有的通路權限都無效,需要使用root賬号進行登入
// 進入管理者資料庫
use admin
// 建立root賬号
db.createUser({
user: 'python',
pwd:'123456',
roles:["root"]
})
db.createUser({
user: 'user_01',
pwd:'123456',
roles:[
{
db: 'db_01',
role: 'readWrite' // 讀寫都支援,read 隻讀,write 隻寫
}
]
})
db.createUser({
user: 'user_02',
pwd:'123456',
roles:[
{
db: 'db_02',
role: 'readWrite' // 讀寫都支援,read 隻讀,write 隻寫
}
]
})
登入賬号
// 進入管理者資料庫
use admin
// 登入,如果傳回 1 表示登入成功
db.auth('使用者名','密碼')
删除使用者
use admin
// 可以删除使用者但是希望使用另一種方式删除
db.removeUser('user_01')
// 或
db.dropUser('user_02')
資料庫操作流程
mongodb 資料庫有哪些組成
-
- 資料庫(database) -> 資料庫
-
- 集合(collections) -> 表
-
- 文檔 -> 行
-
- field -> 字段
-
- index
-
- _id -> 主鍵
database 操作
擷取資料庫清單
show databases;
進入資料庫
use 資料庫名字
檢視目前進入的資料庫位置
db
建立database
// 進入某個資料庫中,如果該資料庫被添加資料自動建立
use 資料庫
删除database
// 進入資料庫
use 資料庫
// 删除資料庫
db.dropDatabase()
集合(表)操作
前提條件
use 資料庫
檢視所有的集合
建立集合
建立第一種方案
db.createCollection('集合名稱')
第二種方案
如果直接添加資料會自動建立集合
删除集合
db.集合名稱.drop()
資料操作
前提條件
use 資料庫
增加(insert)
// 單條查詢
db.stu.insert(
{
name:"小明",
age:
}
)
// 定義變量插入
data = {
name:"小紅",
age:
}
db.stu.insert(data)
// 批量插入
data = [
{
name:"小王",
age:
},
{
name:"小李",
age:
}
]
db.stu.insertMany(data)
更新 (update)
格式 db.stu.update(“更新條件”,”更新内容”,”更新方式”)
預設更新整體更新
db.stu.update(
{
name:"小王"
},
{
age:
}
)
局部更新方式 $set
db.stu.update(
{
name:"小明"
},
{
$set: {
age:
}
}
)
批量更新,預設情況下隻更新一條
db.stu.update(
{
name:"小李"
},
{
$set: {
age:
}
},
{
multi:true //預設不填寫就是 false
}
)
删除 (delete)
// 預設情況下是全部符合條件的删除
db.stu.remove(
{
name:"小明"
}
)
// 僅僅隻删除一條
db.stu.remove(
{
name:"小李"
},
{
justOne:true // 預設删除是false
}
)
// 清空資料
db.stu.remove({})
資料:
db.stu.insert({_id : 1, name:’郭靖’,hometown:’蒙古’,age:20,gender:true})
db.stu.insert({_id : 2, name:’黃蓉’,hometown:’桃花島’,age:18,gender:false})
db.stu.insert({_id : 3, name:’華筝’,hometown:’蒙古’,age:18,gender:false})
db.stu.insert({_id : 4, name:’黃藥師’,hometown:’桃花島’,age:40,gender:true})
db.stu.insert({_id : 5, name:’段譽’,hometown:’大理’,age:16,gender:true})
db.stu.insert({_id : 6, name:’段王爺’,hometown:’大理’,age:45,gender:true})
資料儲存
根據進行判定,如果
_id
存在我就更新,如果
_id
不存在就插入
_id
查詢
- 查詢所有資料
db.stu.find()
- 查詢一條資料
db.stu.findOne()
- 查詢帶條件
db.stu.find(
{
gender:false,
hometown:"蒙古"
}
)
- 比較運算符查詢(
,$gt
,$gte
,$lt
,$lte
)$ne
db.stu.find(
{
age:{$ne:}
}
)
- 邏輯運算符($or)
db.stu.find(
{
$or:[
{age:,gender:true},
{hometown:'蒙古'}
]
}
)
- 範圍運算符( in, i n , nin)
// $in 兩個資料要麼 18 要麼 45
db.stu.find(
{
hometown:{$in:["蒙古","桃花島"]}
}
)
- 正規表達式
// 寫法一
db.stu.find(
{
hometown:/^蒙/
}
)
// 寫法二
db.stu.find(
{
hometown:{$regex:"^蒙"}
}
)
- 自定義查詢
db.stu.find(
{
$where: function() {
return this.age > && this.age <
}
}
)
- limit 和 skip
// limit 使用
db.stu.find().limit()
// skip 使用
db.stu.find().skip()
// 同時使用 不管代碼 在前還是在後都是 先 skip 後 limit
db.stu.find().limit().skip()
db.stu.find().skip().limit()
- 投影,是否顯示字段 (1:表示顯示,0:表示不顯示)
db.stu.find(
{
age:
},
{
_id:
}
)
- 排序 (1 表示升序,-1 表示降序)
db.stu.find().sort(
{
age:,
hometown:
}
)
- 統計個數
// 第一種寫法
db.stu.find({age:}).count()
// 第二種寫法
db.stu.count(
{
age:
}
)
- 消除重複
db.stu.distinct('hometown',{age:{$gt:}})
聚合查詢
格式
db.集合名稱.aggregate([
{管道 : {表達式}},
{管道 : {表達式}},
{管道 : {表達式}},
...
])
$group 管道對某些資料進行分組操作
定義要分組的字段必須
$group
上,内容字段必須加上
_id
$
// 按照性别分組,計算總數
db.stu.aggregate([
{$group:{
// _id 必須填寫
_id:'$gender',
// $sum 對分組後的資料集合進行數量統計
counter:{$sum:}
}
}
])
// 按照性别分組,計算最大年齡
db.stu.aggregate([
{$group:{
// _id 必須填寫
_id:'$gender',
max:{$max:'$age'}
}
}
])
// 按照性别分組,計算最小年齡
db.stu.aggregate([
{$group:{
// _id 必須填寫
_id:'$gender',
min:{$min:'$age'}
}
}
])
// 按照性别進行分組,計算來自的地區
// $push 把具體資料放入清單
// $$ROOT 表示整條資料
db.stu.aggregate([
{$group:{
// _id 必須填寫
_id:'$gender',
from:{$push:'$$ROOT'}
}
}
]).pretty()
// 按照性别進行分組,對分組内容計算平均值
db.stu.aggregate([
{$group:{
// _id 必須填寫
_id:'$gender',
avgAge:{$avg:'$age'}
}
}
])
$match
管道 過濾資料
$match
// match 基本操作
db.stu.aggregate([
{
$match:{
age:{$gt:}
}
}
// 管道 結果 可以提供給下一個管道作為資料源
// 需求:去除所有小于20歲,對性别進行分組,擷取來的家鄉
db.stu.aggregate([
{
$match:{
age:{$lt:}
}
},
{
$group:{
_id:"$gender",
from:{$push:"$hometown"}
}
}
])
$project
對字段是否顯示
$project
// 需求:去除所有小于20歲,對性别進行分組,擷取來的家鄉
db.stu.aggregate([
{
$match:{
age:{$lt:}
}
},
{
$group:{
_id:"$gender",
from:{$push:"$hometown"}
}
},
{
$project:{
_id:
}
}
])
$sort
管道,排序,1:升序 -1:降序
$sort
db.stu.aggregate([
{
$match:{
age:{$lt:}
}
},
{
$sort:{
age:
}
}
])
$limit
和 $skip
管道,2個同時使用需要注意順序
$limit
$skip
db.stu.aggregate([
{
$match:{
age:{$lt:}
}
},
{
$sort:{
age:
}
},
{
$skip:
},
{
$limit:
}
])
$unwind
管道,拆分清單資料變成多條資料,預設情況下如果資料為空或者是空清單就過濾
$unwind
資料構造:
db.t3.insert([
{ “_id” : 1, “item” : “a”, “size”: [ “S”, “M”, “L”] },
{ “_id” : 2, “item” : “b”, “size” : [ ] },
{ “_id” : 3, “item” : “c”, “size”: “M” },
{ “_id” : 4, “item” : “d” },
{ “_id” : 5, “item” : “e”, “size” : null }
])
db.t3.aggregate([
{
$unwind:'$size'
}
])
// 不丢失資料
db.t3.aggregate([
{
$unwind: {
path:"$size",
preserveNullAndEmptyArrays:true // 不過濾資料,保留白清單和為空的資料
}
}
])
索引
建立索引
db.集合.ensureIndex({屬性:})
列出索引
db.t1.getIndexes()
删除索引
db.t1.dropIndex('索引名稱')