MongoDB從入門(mén)到實(shí)戰(zhàn)之MongoDB工作常用操作命令
今天我們主要是了解一下在日常工作中 MongoDB 一些常用的操作命令,主要是在Docker中的MongoDB容器中做演示,大多數(shù)命令在Navicat中也是可以直接執(zhí)行的。
1. 進(jìn)入創(chuàng)建的MongoDB容器
docker ps -- 查看MongoDB容器
docker exec -it mongo-test mongosh -- 進(jìn)入MondoDB容器中
2. 數(shù)據(jù)庫(kù)常用命令
(1) Help指令幫助
help #命令提示符
db.help() #數(shù)據(jù)庫(kù)方法幫助信息
db.mycoll.help() #集合方法幫助信息
(2) 切換/創(chuàng)建數(shù)據(jù)庫(kù)
#假如已經(jīng)存在的數(shù)據(jù)庫(kù)會(huì)直接切換到指定的數(shù)據(jù)庫(kù)
use testDb
#當(dāng)創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)需要?jiǎng)?chuàng)建一個(gè)集合(table)的時(shí)候才會(huì)把數(shù)據(jù)庫(kù)持久化到磁盤(pán)中
【可能一開(kāi)始創(chuàng)建數(shù)據(jù)庫(kù)時(shí),是在內(nèi)存中的,還沒(méi)有持久化到磁盤(pán)。新建集合時(shí),就持久化了】
use testDb
db.createCollection("mybooks")
(3) 數(shù)據(jù)庫(kù)查看
show dbs #查看所有數(shù)據(jù)庫(kù)
db 或 db.getName() #查看當(dāng)前使用的數(shù)據(jù)庫(kù)
(4) 顯示當(dāng)前db狀態(tài)
db.stats()
(5) 查看當(dāng)前db版本
db.version()
(6) 查看當(dāng)前db的連接服務(wù)器機(jī)器地址
db.getMongo()
(7) 刪除當(dāng)前使用數(shù)據(jù)庫(kù)
db.dropDatabase()
(8) 查詢(xún)之前的錯(cuò)誤信息和清除
db.getPrevError()
db.resetError()
3. Collection集合創(chuàng)建、查看、刪除
(1) 集合創(chuàng)建
db.createCollection("MyBooks") #MyBooks集合名稱(chēng)
(2) 查看當(dāng)前數(shù)據(jù)庫(kù)中的所有集合
show collections
(3) 集合刪除
db.MyBooks.drop() #MyBooks要?jiǎng)h除的集合名稱(chēng)
4. Document文檔增刪改查
(1) 文檔插入
① insert多個(gè)文檔插入:
MongoDB使用insert() 方法向集合中插入一個(gè)或多個(gè)文檔,語(yǔ)法如下:
db.COLLECTION_NAME.insert(document)
注意:insert(): 若插入的數(shù)據(jù)主鍵已經(jīng)存在,則會(huì)拋 org.springframework.dao.DuplicateKeyException 異常,提示主鍵重復(fù),不保存當(dāng)前數(shù)據(jù)。
② 示例:
添加數(shù)據(jù)源:
[{
name: "追逐時(shí)光者",
phone: "15012454678"
}, {
name: "王亞",
phone: "18687654321"
}, {
name: "大姚",
phone: "13100001111"
}, {
name: "小袁",
phone: "131054545541"
}]
多條文檔數(shù)據(jù)插入:
db.Contacts.insert([{
name: "追逐時(shí)光者",
phone: "15012454678"
}, {
name: "王亞",
phone: "18687654321"
}, {
name: "大姚",
phone: "13100001111"
}, {
name: "小袁",
phone: "131054545541"
}])
查看插入文檔數(shù)據(jù):
db.Contacts.find()
③ insertOne一個(gè)文檔插入:
insert() 方法可以同時(shí)插入多個(gè)文檔,但如果您只需要將一個(gè)文檔插入到集合中的話,可以使用 insertOne() 方法,該方法的語(yǔ)法格式如下:
db.COLLECTION_NAME.insertOne(document)
④ 示例:
添加數(shù)據(jù)源:
{
bookName: "平凡的世界",
author: "路遙"
}
添加示例:
db.MyBooks.insertOne({
bookName: "平凡的世界",
author: "路遙"
})
(2) 文檔更新
update() 方法用于更新已存在的文檔。語(yǔ)法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
參數(shù)說(shuō)明:
- query:update的查詢(xún)條件,類(lèi)似sql update查詢(xún)內(nèi)where后面的。
- update:update的對(duì)象和一些更新的操作符(如$、$inc...)等,也可以理解為sql update查詢(xún)內(nèi)set后面的。
- upsert:可選,這個(gè)參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認(rèn)是false,不插入。
- multi:可選,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個(gè)參數(shù)為true,就把按條件查出來(lái)多條記錄全部更新。
- writeConcern:可選,拋出異常的級(jí)別。
示例:
更改bookName:"平方的世界"書(shū)籍名稱(chēng)改成“平方的世界”
db.MyBooks.update({'bookName':'平方的世界'},{$set:{'bookName':'平凡的世界'}})
修改成功后的結(jié)果:
(3) 文檔查詢(xún)
MongoDB 查詢(xún)數(shù)據(jù)的語(yǔ)法格式如下:
db.collection.find(query, projection)
- query:可選,使用查詢(xún)操作符指定查詢(xún)條件
- projection:可選,使用投影操作符指定返回的鍵。查詢(xún)時(shí)返回文檔中所有鍵值,只需省略該參數(shù)即可(默認(rèn)省略)。
如果你需要以易讀的方式來(lái)讀取數(shù)據(jù),可以使用 pretty() 方法,語(yǔ)法格式如下:
db.col.find().pretty()
pretty() 方法以格式化的方式來(lái)顯示所有文檔。
① 查詢(xún)Contacts集合中的所有數(shù)據(jù):
db.Contacts.find().pretty()
② MongoDB 與 RDBMS Where 語(yǔ)句比較:
如果你熟悉常規(guī)的 SQL 數(shù)據(jù),通過(guò)下表可以更好的理解 MongoDB 的條件語(yǔ)句查詢(xún):
③ MongoDB AND 條件:
MongoDB 的 find() 方法可以傳入多個(gè)鍵(key),每個(gè)鍵(key)以逗號(hào)隔開(kāi),即常規(guī) SQL 的 AND 條件。
語(yǔ)法格式如下:
db.col.find({key1:value1, key2:value2}).pretty()
④ 查詢(xún)集合(Contacts)中name="小袁" 和 phnotallow="131054545541"記錄:
db.Contacts.find({"name":"小袁", "phone":"131054545541"}).pretty()
⑤ MongoDB OR 條件:
MongoDB OR 條件語(yǔ)句使用了關(guān)鍵字 $or,語(yǔ)法格式如下:
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
查詢(xún)集合(Contacts)中name="小袁" 或 name="大姚"記錄:
db.Contacts.find({$or:[{"name":"小袁"},{"name": "大姚"}]}).pretty()
⑥ AND 和 OR 聯(lián)合使用:
以下實(shí)例演示了 AND 和 OR 聯(lián)合使用,類(lèi)似常規(guī) SQL 語(yǔ)句為: 'where age>18 AND ("name"="小袁" OR "name"="大姚")':
db.Contacts.find({"age": {$gt:18}, $or: [{"name":"小袁"},{"name": "大姚"}]}).pretty()
(4) 文檔刪除
remove() 方法的基本語(yǔ)法格式如下所示:
db.collection.remove(
<query>,
{
justOne: <boolean>, writeConcern: <document>
}
)
參數(shù)說(shuō)明:
- query:必選項(xiàng),是設(shè)置刪除的文檔的條件。
- justOne:布爾型的可選項(xiàng),默認(rèn)為false,刪除符合條件的所有文檔,如果設(shè)為 true,則只刪除一個(gè)文檔。
- writeConcem:可選項(xiàng),設(shè)置拋出異常的級(jí)別。
① 根據(jù)某個(gè)_id值刪除數(shù)據(jù):
#_id為字符串的話,可以直接這樣
db.collection.remove({"_id":"你的id"});
#_id由MongoDB自己生成時(shí)
db.collection.remove({'_id':ObjectId("636680729003374f6a6c7add")})
② 移除 title 為“MongoDB”的文檔:
db.colection.remove({'title': 'MongoDB'})
5. MongoDB Limit與Skip方法
(1) Contacts集合數(shù)據(jù)展示
(2) MongoDB Limit方法
如果你需要在MongoDB中讀取指定數(shù)量的數(shù)據(jù)記錄,可以使用MongoDB的Limit方法,limit()方法接受一個(gè)數(shù)字參數(shù),該參數(shù)指定從MongoDB中讀取的記錄條數(shù)。
語(yǔ)法:
limit()方法基本語(yǔ)法如下所示:
db.COLLECTION_NAME.find().limit(NUMBER)
示例:
查詢(xún)Contacts集合中的前兩條數(shù)據(jù):
注意:如果沒(méi)有指定limit()方法中的參數(shù)則顯示集合中的所有數(shù)據(jù)。
db.Contacts.find().limit(2)
(3) MongoDB Skip方法
我們除了可以使用limit()方法來(lái)讀取指定數(shù)量的數(shù)據(jù)外,還可以使用skip()方法來(lái)跳過(guò)指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個(gè)數(shù)字參數(shù)作為跳過(guò)的記錄條數(shù)。
語(yǔ)法:skip() 方法腳本語(yǔ)法格式如下:
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
示例:
查詢(xún)Contacts集合中的第2條數(shù)據(jù):
# 顯示一條如何在跳過(guò)一條
db.Contacts.find().limit(1).skip(1)
6. MongoDB排序
在MongoDB 中使用 sort() 方法對(duì)數(shù)據(jù)進(jìn)行排序,sort() 方法可以通過(guò)參數(shù)指定排序的字段,并使用 1 和 -1 來(lái)指定排序的方式,其中 1 為升序排列,而 -1 是用于降序排列。
語(yǔ)法:
sort()方法基本語(yǔ)法如下所示:
db.COLLECTION_NAME.find().sort({KEY:1})
示例:
在Contacts集合中讓name按照降序來(lái)排列:
db.Contacts.find().sort({"name":-1})
7. MongoDB索引
(1) 說(shuō)明
- 索引通常能夠極大的提高查詢(xún)的效率,如果沒(méi)有索引,MongoDB在讀取數(shù)據(jù)時(shí)必須掃描集合中的每個(gè)文件并選取那些符合查詢(xún)條件的記錄。
- 這種掃描全集合的查詢(xún)效率是非常低的,特別在處理大量的數(shù)據(jù)時(shí),查詢(xún)可以要花費(fèi)幾十秒甚至幾分鐘,這對(duì)網(wǎng)站的性能是非常致命的。
- 索引是特殊的數(shù)據(jù)結(jié)構(gòu),索引存儲(chǔ)在一個(gè)易于遍歷讀取的數(shù)據(jù)集合中,索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)。
(2) 語(yǔ)法
createIndex()方法基本語(yǔ)法格式如下所示:
注意:語(yǔ)法中 Key 值為你要?jiǎng)?chuàng)建的索引字段,1 為指定按升序創(chuàng)建索引,如果你想按降序來(lái)創(chuàng)建索引指定為 -1 即可。
db.collection.createIndex(keys, options)
(3) createIndex() 接收可選參數(shù),可選參數(shù)列表如下:
① 為Contacts集合中的name字段按降序設(shè)置索引:
db.Contacts.createIndex({"name":-1})
② 為Contacts集合中的name字段和phone字段同時(shí)按降序設(shè)置索引(關(guān)系型數(shù)據(jù)庫(kù)中稱(chēng)作復(fù)合索引):
db.Contacts.createIndex({"name":-1,"phone":-1})
③ 以后臺(tái)方式給Contacts集合中的phone字段按降序設(shè)置索引:
db.Contacts.createIndex({"phone": 1}, {background: true})
8. MongoDB聚合
MongoDB 中聚合(aggregate)主要用于處理數(shù)據(jù)(諸如統(tǒng)計(jì)平均值,求和等),并返回計(jì)算后的數(shù)據(jù)結(jié)果。
類(lèi)似SQL語(yǔ)句中的 count(*)。
(1) 語(yǔ)法
aggregate() 方法的基本語(yǔ)法格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
(2) 首先創(chuàng)建一個(gè)BlogCollection集合,并批量插入多個(gè)文檔數(shù)據(jù):
#創(chuàng)建集合
use BolgCollection
#批量插入集合文檔數(shù)據(jù)
db.BlogCollection.insert([{
title: '學(xué)習(xí)MongoDB',
description: 'MongoDB is no sql database',
by_user: '時(shí)光者',
likes: 100
},
{
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: '時(shí)光者',
likes: 10
},
{
title: 'Docker入門(mén)學(xué)習(xí)',
description: 'Docker入門(mén)學(xué)習(xí)教程',
by_user: '時(shí)光者',
likes: 100
},
{
title: '.Net Core入門(mén)學(xué)習(xí)',
description: '.Net Core入門(mén)學(xué)習(xí)',
by_user: '大姚',
likes: 750
},
{
title: 'Golang入門(mén)學(xué)習(xí)',
description: 'Golang入門(mén)學(xué)習(xí)',
by_user: '小藝',
likes: 750
}])
#查詢(xún)集合所有文檔數(shù)據(jù)
db.BlogCollection.find()
(3) $sum分組統(tǒng)計(jì)以上BlogCollection集合每個(gè)作者所寫(xiě)的文章數(shù):
db.BlogCollection.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
(3) 類(lèi)似于SQL語(yǔ)句:
select by_user, count(*) from BlogCollection group by by_user
(4) $sum 計(jì)算likes的總和:
db.BlogCollection.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
(5) $avg 計(jì)算Likes的平均值:
db.BlogCollection.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
(6) $min 獲取集合中所有文檔對(duì)應(yīng)值得最小值:
db.BlogCollection.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$max 獲取集合中所有文檔對(duì)應(yīng)值得最大值:
db.BlogCollection.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])