Docker安裝MongoDB
拉取鏡像:
docker pull mongo:6.0.2
創(chuàng)建容器:
docker run --name mongo -d -p 27017:27017 mongo:6.0.2
設(shè)置用戶名和密碼:
# 創(chuàng)建mongo容器后,進(jìn)入容器
docker exec -it mongo bash
# 進(jìn)入mongo shell
mongosh
# 進(jìn)入admin數(shù)據(jù)庫
use admin
# 創(chuàng)建用戶名和密碼
db.createUser({user:'zhangdapeng',pwd:'zhangdapeng520',roles:[{role:'root',db:'admin'}]})
校驗(yàn)用戶名和密碼:
# 認(rèn)證登錄db.auth('用戶名','密碼'),打印1則代表認(rèn)證通過
db.auth('zhangdapeng','zhangdapeng520')
數(shù)據(jù)庫管理
創(chuàng)建數(shù)據(jù)庫:
use db;
查看所有數(shù)據(jù)庫:
show dbs
插入一條數(shù)據(jù),再查看所有數(shù)據(jù)庫:
db.db.insertOne({"name":"張大鵬"})
show dbs
刪除數(shù)據(jù)庫:
db.dropDatabase()
show dbs
集合管理
集合相當(dāng)于一張表,創(chuàng)建一張user集合:
use test
db.createCollection("user")
查看所有的集合:
show collections
創(chuàng)建固定集合 mycol,整個(gè)集合空間大小 6142800 B, 文檔最大個(gè)數(shù)為 10000 個(gè)。
db.createCollection("mycol", {capped: true, autoIndexId: true, size: 6142800, max: 10000 })
show collections
在 MongoDB 中,你不需要?jiǎng)?chuàng)建集合。當(dāng)你插入一些文檔時(shí),MongoDB 會(huì)自動(dòng)創(chuàng)建集合。
db.mycol2.insert({"name" : "張大鵬"})
show collections
刪除集合:
db.mycol2.drop()
show collections
新增文檔
向user集合中新增張三:
db.user.insert({name: '張三', age: 22})
show collections
查詢所有的用戶:
db.user.find()
向user集合中新增李四:
db.user.insertOne({name: '李四', age: 24})
db.user.find()
向user集合中新增趙六和田七:
db.user.insertMany([{name: '趙六', age: 26},{name: '田七', age: 27}])
db.user.find()
更新文檔
update() 方法
update() 方法用于更新已存在的文檔。語法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
參數(shù)說明:
- query : update的查詢條件,類似sql update查詢內(nèi)where后面的。
- update : update的對象和一些更新的操作符(如 , , ,inc…)等,也可以理解為sql update查詢內(nèi)set后面的
- upsert : 可選,這個(gè)參數(shù)的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認(rèn)是false,不插入。
- multi : 可選,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個(gè)參數(shù)為true,就把按條件查出來多條記錄全部更新。
- writeConcern :可選,拋出異常的級別。
實(shí)戰(zhàn)案例
將張三修改為張三333:
db.user.find()
db.user.update({'name':'張三'},{$set:{'name':'張三333'}})
db.user.find()
更多實(shí)例
只更新第一條記錄:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一條:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加進(jìn)去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一條記錄:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
使用updateOne修改
db.user.updateOne({"name":"李四"},{$set:{"age":34}})
使用updateMany修改
db.user.updateMany({"age":{$gt:30}},{$set:{"age":33}})
刪除文檔
實(shí)戰(zhàn)案例
刪除張三:
db.user.find()
db.col.remove({'name':'張三'})
db.user.find()
deleteOne刪除
刪除張三333:
db.user.find()
db.user.deleteOne({'name':'張三333'})
db.user.find()
deleteMany刪除
刪除李四:
db.user.find()
db.user.deleteMany({'name':'李四'})
db.user.find()
刪除年齡大于30的用戶:
db.user.deleteMany({"age":{$gt:30}})
findOneAndDelete刪除
刪除趙六:
db.user.find()
db.user.findOneAndDelete({'name':'趙六'})
db.user.find()
查詢文檔
條件運(yùn)算符
操作 | 格式 | 范例 | RDBMS中的類似語句 |
---|---|---|---|
等于 |
{<key>:<value> } |
db.col.find({"by":"張三"}).pretty() |
where by = '張三' |
小于 | {<key>:{$lt:<value>}} |
db.col.find({"likes":{$lt:50}}).pretty() |
where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} |
db.col.find({"likes":{$lte:50}}).pretty() |
where likes <= 50 |
大于 | {<key>:{$gt:<value>}} |
db.col.find({"likes":{$gt:50}}).pretty() |
where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} |
db.col.find({"likes":{$gte:50}}).pretty() |
where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} |
db.col.find({"likes":{$ne:50}}).pretty() |
where likes != 50 |
邏輯運(yùn)算符
and運(yùn)算:
db.col.find({key1:value1, key2:value2}).pretty()
or運(yùn)算:
db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
實(shí)戰(zhàn)案例
查詢名字叫張三的:
# 刪除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '張三', age: 23},{name: '趙六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查詢
db.user.find({"name":"張三"})
查詢年齡小于30的:
# 刪除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '張三', age: 23},{name: '趙六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查詢
db.user.find({"age":{$lt:30}})
查看年齡小于30且大于25的:
# 刪除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '張三', age: 23},{name: '趙六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查詢
db.user.find({"age":{$lt:30,$gt:25}})
查看名字叫張三或者名字叫李四的:
# 刪除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '張三', age: 23},{name: '趙六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查詢
db.user.find({$or:[{"name":"張三"},{"name":"l"}]})
分頁查詢
實(shí)戰(zhàn)案例
每頁2條數(shù)據(jù),查詢第2頁:
# 刪除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '張三', age: 23},{name: '趙六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查詢
db.user.find().limit(2).skip(2)
根據(jù)年齡排序,每頁2條數(shù)據(jù),查詢第2頁:在 MongoDB 中使用 sort() 方法對數(shù)據(jù)進(jìn)行排序,sort() 方法可以通過參數(shù)指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用于降序排列。
# 刪除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '張三', age: 23},{name: '趙六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查詢
db.user.find().sort({}).limit(2).skip(2)
聚合查詢
聚合語法
表達(dá)式 | 描述 | 實(shí)例 |
---|---|---|
$sum | 計(jì)算總和。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { s u m : " sum : " sum:"likes"}}}]) |
$avg | 計(jì)算平均值 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { a v g : " avg : " avg:"likes"}}}]) |
$min | 獲取集合中所有文檔對應(yīng)值得最小值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m i n : " min : " min:"likes"}}}]) |
$max | 獲取集合中所有文檔對應(yīng)值得最大值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : { m a x : " max : " max:"likes"}}}]) |
$push | 將值加入一個(gè)數(shù)組中,不會(huì)判斷是否有重復(fù)的值。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { p u s h : " push: " push:"url"}}}]) |
$addToSet | 將值加入一個(gè)數(shù)組中,會(huì)判斷是否有重復(fù)的值,若相同的值在數(shù)組中已經(jīng)存在了,則不加入。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : { a d d T o S e t : " addToSet : " addToSet:"url"}}}]) |
$first | 根據(jù)資源文檔的排序獲取第一個(gè)文檔數(shù)據(jù)。 | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", first_url : { f i r s t : " first : " first:"url"}}}]) |
$last | 根據(jù)資源文檔的排序獲取最后一個(gè)文檔數(shù)據(jù) | db.mycol.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", last_url : { l a s t : " last : " last:"url"}}}]) |
常用操作
這里我們介紹一下聚合框架中常用的幾個(gè)操作:
- $project:修改輸入文檔的結(jié)構(gòu)??梢杂脕碇孛?、增加或刪除域,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔。
- m a t c h :用于過濾數(shù)據(jù),只輸出符合條件的文檔。 match:用于過濾數(shù)據(jù),只輸出符合條件的文檔。 match:用于過濾數(shù)據(jù),只輸出符合條件的文檔。match使用MongoDB的標(biāo)準(zhǔn)查詢操作。
- $limit:用來限制MongoDB聚合管道返回的文檔數(shù)。
- $skip:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔。
- $unwind:將文檔中的某一個(gè)數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個(gè)值。
- $group:將集合中的文檔分組,可用于統(tǒng)計(jì)結(jié)果。
- $sort:將輸入文檔排序后輸出。
- $geoNear:輸出接近某一地理位置的有序文檔。
實(shí)戰(zhàn)案例
查詢用戶總數(shù):文章來源:http://www.zghlxwxcb.cn/news/detail-813618.html
# 刪除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '張三', age: 23},{name: '趙六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查詢
db.user.countDocuments()
查詢用戶平均年齡:文章來源地址http://www.zghlxwxcb.cn/news/detail-813618.html
# 刪除集合
db.user.drop()
# 批量新增
db.user.insertMany([{name: '李四', age: 34},{name: '張三', age: 23},{name: '趙六', age: 26},{name: '田七', age: 27}])
db.user.find()
# 查詢用戶數(shù)量和平均年齡
db.user.aggregate([{$group:{_id: null, total_num: {$sum:1},total_avg: {$avg: "$age"}}}])
到了這里,關(guān)于Python私教MongoDB快速入門教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!