本文主要介紹 MongoDB 命令行的使用,使用到的軟件版本:MongoDB 5.0.5、Centos 7.6。
1、mongo 語法
mongo 命令在 bin 目錄下,用法如下:
./mongo [options] [db address] [file names (ending in .js)]
常用參數:
--host 主機
--port 端口
-u [ --username ] 用戶名
-p [ --password ] 密碼
詳細的說明可查看幫助:
./mongo -h
例子:
cd $MONGODB_HOME/bin
./mongo
2、命令
2.1、數據庫
A、切換數據庫(沒有會先創建數據庫):use DATABASE_NAME
B、刪除數據庫:db.dropDatabase():
例子:
> use testdb
> db.dropDatabase()
2.2、集合
A、創建集合
db.createCollection(name, options)
name: 集合名稱
options: 可選參數,如下所示:
字段 | 類型 | 描述 |
---|---|---|
capped | 布爾 | 是否創建固定集合;如果為 true,必須指定 size 參數。 |
size | 數值 | 固定集合的大小。 |
max | 數值 | 固定集合包含的最大文檔數。 |
B、列出集合:show collections
C、刪除集合:db.collection.drop()
例子:
> use testdb > db.createCollection('col1') > show collections > db.col1.drop()
2.3、文檔
2.3.1、創建文檔
插入一個文檔:
db.collection.insertOne( <document>, { writeConcern: <document> } )
插入多個文檔:
db.collection.insertMany( [ <document 1> , <document 2>, ... ], { writeConcern: <document>, ordered: <boolean> } )
參數說明:
document:要寫入的文檔。
writeConcern:寫入策略,是否需確認寫操作;1:需確認,0 無需確認;默認為 1。
ordered:是否按順序寫入,默認 true。
例子:
> db.col1.insertOne({name:'jack',age:20})
2.3.2、更新文檔
更新第一個匹配的文檔:
db.collection.updateOne( <filter>, <update>, { upsert: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ], hint: <document|string> // Available starting in MongoDB 4.2.1 } )
更新所有匹配的文檔:
db.collection.updateMany( <filter>, <update>, { upsert: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ], hint: <document|string> // Available starting in MongoDB 4.2.1 } )
參數說明:
filter: 查詢條件,類似 sql 的 where 條件
update: 更新的對象,可理解為 sql 的 set 子句
upsert: 可選,如果查詢不到文檔,是否插入更新的文檔;默認 false
writeConcern: 可選,寫入策略,是否需確認寫操作;1:需確認,0 無需確認
collation: 可選,排序規則
arrayFilters: 過濾器
hint: 查詢時使用索引
例子:
> db.col1.updateOne({name:'jack'},{$set:{name:'jack2',age:22}})
2.3.3、刪除文檔
刪除第一個匹配的文檔:
db.collection.deleteOne( <filter>, { writeConcern: <document>, collation: <document>, hint: <document|string> // Available starting in MongoDB 4.4 } )
刪除所有匹配的文檔:
db.collection.deleteMany( <filter>, { writeConcern: <document>, collation: <document> } )
參數說明:
filter: 查詢條件,類似 sql 的 where 條件
writeConcern: 可選,寫入策略,是否需確認寫操作;1:需確認,0 無需確認
collation: 可選,排序規則
hint: 查詢時使用索引
例子:
> db.col1.deleteOne({name:'jack2'})
2.3.4、查詢文檔
查詢第一個匹配的文檔:
db.collection.findOne(query, projection)
查詢所有匹配的文檔:
db.collection.find(query, projection)
參數說明:
query:可選,查詢條件
projection:可選,指定查詢返回的鍵
例子:
> db.col1.find() > db.col1.find({},{_id:0})
2.3.5、條件操作符
MongoDB 與 SQL 中條件操作符的比較:
操作 | 格式 | 范例 | RDBMS中的類似語句 |
---|---|---|---|
等於 | {<key>:<value> } |
db.col.find({"name":"jack"}).pretty() |
where by = 'jack' |
小於 | {<key>:{$lt:<value>}} |
db.col.find({"age":{$lt:50}}).pretty() |
where age< 50 |
小於或等於 | {<key>:{$lte:<value>}} |
db.col.find({"age":{$lte:50}}).pretty() |
where age<= 50 |
大於 | {<key>:{$gt:<value>}} |
db.col.find({"age":{$gt:50}}).pretty() |
where age> 50 |
大於或等於 | {<key>:{$gte:<value>}} |
db.col.find({"age":{$gte:50}}).pretty() |
where age>= 50 |
不等於 | {<key>:{$ne:<value>}} |
db.col.find({"age":{$ne:50}}).pretty() |
where age!= 50 |
MongoDB AND 條件:傳入多個字段,字段之間為 and 的關系。
db.col.find({key1:value1, key2:value2})
MongoDB OR 條件:通過 $or 關鍵字來實現。
db.col.find({$or: [{key1: value1}, {key2:value2}]}
例子:
> db.col1.find({name:'jack',age:{$lt:50}}) #相當於 name='jack' and age<50 > db.col1.find({age:{$lt:50},$or:[{name:'jack'},{name:'luci'}]}) #相當於 age<50 and (name='jack' or name='luci')
2.3.6、$type 操作符
$type 操作符用於檢索匹配的數據類型。
例子:
> db.col1.find({name:{$type:'string'}}) > db.col1.find({name:{$type:2}})
2.3.7、MongoDB skip 與 limit方法
skip 表示跳過指定數量的文檔,limit 表示讀取指定數量的文檔。
例子:
> db.col1.find().skip(1).limit(2)
2.3.8、MongoDB 排序
MongoDB 中使用 sort() 方法對數據進行排序
db.COLLECTION_NAME.find().sort({KEY:1})
1 表示升序,-1 表示降序
例子:
> db.col1.find().sort({name:1})
2.3.9、MongoDB 聚合
MongoDB 中使用 aggregate 方法來實現聚和功能:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
相應聚合的表達式如下:
表達式 | 描述 | 實例 | 類似 SQL |
---|---|---|---|
$sum | 計算總和 | db.col1.aggregate([{$group: {_id: "$name", num: {$sum : "$age"}}}]) | select name,sum(age) from col1 group by name |
db.col1.aggregate([{$group: {_id: "$name", num: {$sum : 1}}}]) | select name,count(*) from col1 group by name | ||
$avg | 計算平均值 | db.col1.aggregate([{$group: {_id: "$name", num: {$avg: "$age"}}}]) | select name,avg(age) from col1group by name |
$min | 獲取最小值。 | db.col1.aggregate([{$group: {_id: "$name", num: {$min: "$age"}}}]) | select name,min(age) from col1group by name |
$max | 獲取最大值 | db.col1.aggregate([{$group: {_id: "$name", num: {$max: "$age"}}}]) | select name,max(age) from col1group by name |
$first | 獲取第一條數據 | db.col1.aggregate([{$group: {_id: "$name", num: {$first: "$age"}}}]) | |
$last | 獲取最后一條數據 | db.col1.aggregate([{$group: {_id: "$name", num: {$last: "$age"}}}]) |
管道的概念:
MongoDB 的聚合管道將 MongoDB 文檔在一個管道處理完畢后將結果傳遞給下一個管道處理。MongoDB 聚合中常用的操作:
$project:修改輸入文檔的結構。可以用來重命名、增加或刪除域,也可以用於創建計算結果以及嵌套文檔。
$match:用於過濾數據,只輸出符合條件的文檔。
$limit:只返回指定的文檔數。
$skip:跳過指定的文檔數。
$group:將文檔分組,可用於數據統計。
$sort:文檔排序輸出。
例子:
> db.col1.aggregate([{$group: {_id: "$name", num: {$avg: "$age"}}},{$project:{num:0}}]) > db.col1.aggregate([{$group: {_id: "$name", num: {$avg: "$age"}}},{$match:{_id:'jack'}}]) > db.col1.aggregate([{$group: {_id: "$name", num: {$avg: "$age"}}},{$limit:2}]) > db.col1.aggregate([{$group: {_id: "$name", num: {$avg: "$age"}}},{$sort:{num:1}}])
2.4、索引
2.4.1、創建索引
db.collection.createIndex(keys, options, commitQuorum)
keys:指定創建索引的字段及索引方式(按升序創建索引還是按降序創建索引;1:升序,-1:降序)
options:可選參數
commitQuorum:確定提交的仲裁數量
可選參數如下:
參數 | 類型 | 描述 |
---|---|---|
background | Boolean | 4.2 版本已廢棄。是否阻塞對聚合的其他操作。 |
unique | Boolean | 是否為唯一索引,默認 false。 |
name | string | 索引名稱,如果未指定,則通過拼接索引的字段名和排序方式來生成索引名稱。 |
sparse | Boolean | 如果為 true,則索引僅引用具有指定字段的文檔。默認值為 false。 |
expireAfterSeconds | integer | 設置集合的存在時間,單位為秒。 |
weights | document | 對於文本索引,指定索引權重,1 到 99999 之間,表示該索引字段相對於其他索引字段的得分權重;可以為部分或全部索引字段指定權重。 |
default_language | string | 對於文本索引,指定語言; 默認為英語。 |
language_override | string | 對於文本索引,指定覆蓋的語言,默認值為 language。 |
例子:
> db.col1.createIndex({name:1})
2.4.2、查詢索引
db.collection.getIndexes()
例子:
> db.col1.getIndexes()
2.4.3、刪除索引
db.col.dropIndex(INDEX_NAME)
db.col.dropIndexes()
例子:
> db.col1.dropIndex('name_1') > db.col1.dropIndexes()
2.5、權限
2.5.1、創建用戶
db.createUser(user, writeConcern)
user: 用戶信息
writeConcern: 可選,寫入策略,是否需確認寫操作;1:需確認,0 無需確認
例子:
> use testdb > db.createUser({ ... user: 'test', ... pwd: '123456', ... roles:[{ ... role: 'dbOwner', ... db: 'testdb' ... }] ... })
2.5.2、更新用戶
db.updateUser(username, update, writeConcern)
username: 用戶名
update: 更新信息
writeConcern: 可選,寫入策略,是否需確認寫操作;1:需確認,0 無需確認
例子:
> db.updateUser('test',{pwd:'1234567'})
2.5.3、刪除用戶
db.dropUser(username, writeConcern)
username: 用戶名
writeConcern: 可選,寫入策略,是否需確認寫操作;1:需確認,0 無需確認
2.5.4、認證
如何數據庫開啟的權限認證(啟動時增加 --auth 參數),則需要先認證再執行相應的操作:
db.auth(<username>, <password>)