詳細的mongo工具手冊,包含常見CURD+條件操作+聚合+案例
原創置頂 ldz_miantiao 最後發佈於2019-11-19 21:57:17 閱讀數 36 收藏
展開
之前寫過一篇mongoose常用的經典記錄,用來自查詢,因爲老是忘記mongo的書寫格式,所以索性將自己的學習筆記放到博客上,並供大家參考,如果代碼有問題請在評論指出。
一、創建數據庫
使用原生,insert和save的區別是:insert只會無腦增加,而sava是“有則更新,無則增加”;
//插入一條
db.user.insert({name:"a"})
//插入多條
db.user.insertMany({name:"a"},{name:"b"})
1
2
3
4
使用mongoose創建基礎格式;
const mongoose = require('mongoose')
congst schema = new mongoose.Schema({
name:{
type:String,
require:true
}
})
module.exports = mongoose.model('user',schema)
1
2
3
4
5
6
7
8
9
使用mongoose添加數據(create和save的區別是:create只會無腦增加,而sava是“有則更新,無則增加);
user.create(數據對象) //如:request.body.user
1
二、簡單查詢
findOne()只會返回符合條件第一個文檔,db.user.find() 會返回所有符合條件的文檔;
格式:({“鍵名”:“鍵值”})
例:
db.user.find({'name': "小明"})
1
$and和$or是常用的關鍵符。顧名思義,and是需要一起實現,or是符合之一;
例1:查找名字是小明且性別是男的字段(請注意$and的位置)
db.user.find(
{
$and:[
{'name': "小明"},
{'sex': "男"}
]
}//第一個{}裏面放條件
)
1
2
3
4
5
6
7
8
例2:查找名字是小明且性別是男或者年齡是18的字段(請注意$or的位置)
db.user.find(
{
'name': "小明",
$or:[
{'sex': "男"},
{'age': 18}
]
}//第一個{}裏面放條件
)
1
2
3
4
5
6
7
8
9
投影器 ,設置需要返回的字段值,去除無用的數據字段;
例:假設小明的一條文檔裏有名字、性別、年齡和成績,那麼我只需要返回他的成績字段。
db.user.find(
{
'name': "小明",
},//第一個{}裏面放條件
{
"grade":1 //第二個{}裏放投影
}
)
1
2
3
4
5
6
7
8
使用正則表達式進行條件搜索
例:找出名字以St或者Te開頭的且班級以爲Che開頭的所有人
db.user.find({'name': /(St|Te)*/i, 'class':/(Che)*/i})
1
更多搜索需求請查看後續內容
四、更新(添加)和移除字段
update()和$set()用於更新單個文檔,注意update()默認只更新第一個符合條件的數據,想要更新所有的數據,需要配合使用multi;
格式:({條件},{$set{數據}})
例:將符合條件的第一個小明的性別改成女
db.user.update(
{'name': "小明"}, //第一個{}裏面放條件
{
$set:{'sex': "女"}
}
)
1
2
3
4
5
6
例:將所有小明的性別改成女
db.user.update(
{'name': "小明"}, //第一個{}裏面放條件
{
$set:{'sex': "女"}
},
{
"multi":true //匹配所有符合條件的
}
)
1
2
3
4
5
6
7
8
9
$push和$addToset可以實現插入文檔的功能,結合$each可以插入多個;
$push直接將值插入一個文檔中,並不管相同的值是否已經在數組中存在了。
$addToSet判斷相同的值是否在數組中已經存在,如存在則不再重複加入。
db.user.update(
{'name': "小明"}, //第一個{}裏面放條件
{
$addToset{
"grade": 89 //插入成績,並且檢測是否有重複
}
}
)
1
2
3
4
5
6
7
8
添加多個值到文檔中
db.students.update(
{ name: "小明" },
{
$push:
{
grade: {
$each: [ 90, 92, 89 ]
}
}
}
)
1
2
3
4
5
6
7
8
9
10
11
update()和$unset()通常用來移除字段,同樣的只作用於符合條件的第一個文檔,將multi設置爲true即可作用所有文檔;
例:將所有user裏面的age字段移除
db.user.update(
{'name': "小明"}, //第一個{}裏面放條件
{
$unset:{'age': ""} //移除age
},
{
"multi":true //匹配所有符合條件的
}
)
1
2
3
4
5
6
7
8
9
五、刪除操作
remove()通常同來移除文檔,默認作用於匹配出的第一個;
例:刪除所有name是小明的數據
db.user.remove(
{'name': "小明"}, //第一個{}裏面放條件
{
"multi":true //匹配所有符合條件的
}
)
1
2
3
4
5
6
drop()用來刪除整個集合,返回結果true表示刪除成功;
db.user.drop()
1
六、條件操作符
$lt 小於
$lte 小於等於
$gt 大於
$gte 大於等於
$in 包含(匹配單值)
$all 包含(多值),常用於數組多值匹配
$not 非
$exists 是否存在
例:找出年齡小於18歲的人
db.user.find(
{
'name': { "$lt":18 }
} //第一個{}放條件
)
1
2
3
4
5
例:找出C1 或者C2班級的同學
db.user.find(
{
'name': { "$in":["C1","C2"] }
} //第一個{}放條件
)
1
2
3
4
5
例:設置上限和下限,找出大於16歲,小於18歲的人
db.user.find(
{
'age': { "$gt":16,"$lt":18 }
} //第一個{}放條件
)
1
2
3
4
5
例:找出性別是“男”或者班級的值是C1 或 C2的人,並且年齡要小於18歲
db.user.find(
{
$or:[{
"sex":'男',
"class":{ "$in":["C1","C2"] }
}],
"age":{ "$lt":18 }
} //第一個{}放條件
)
1
2
3
4
5
6
7
8
9
七、其它使用頻率極高的常用操作
所有的操作符是可以連續寫下去的,類似jquery;
$count()根據條件查詢符合要求的文檔的總數量;
例:
db.user.find( {'name': "小明"} ).count() //返回查詢出文檔的總數量
1
$sort()可以將結果進行指定字段進行排序,1是升序,0是降序;
例:將查找到的性別爲 “男” 的字段按照成績進行升序排序。
db.user.find({'sex': "男"}).sort(1);
1
limit(數字)可以限制返回的數量;
例:只返回兩條文檔
db.user.find({'name': "小明"}).limit(2) //
1
skip(數字)可以跳過一定數量的文檔進行查詢,將它於limit()進行配合,可以做分頁功能查詢;
例:跳過前2條數據,再進行查詢,並且只要查詢出10條數據
db.user.find({'name': "小明"}).skip(2).limit(10) //
1
$size可以通過值的數量(常用於數組),來當作條件匹配文檔
例:查找職位(數組)擁有2個的人
db.user.find({'position':{$size: 2}})
1
八、多表關聯:aggregate()
$lookup:根據一個集合的字段,查出另一個相關聯的集合所有信息。
有集合A和集合B,他們的數據描述同一個事務,並且A中用的字段是a,B中用的字段是b,那麼 $lookup可以a與b進行關聯,相當於做成外鍵,並且把B(也可以是A)所有的匹配字段拆出來給對方。
用法:
user.aggregate(
$lookup:{
from: 被join(拆)的集合,
localField: 原集合中 user 的 關鍵字,
foreignField: 被拆集合中的 關鍵字,
as: 新增的 字段名
}
)
1
2
3
4
5
6
7
8
例子:
集合A:
{ "name":a1, "modelA": CCC },
{ "name":a2, "modelA": CCC },
{ "name":a3, "modelA": DDD }
1
2
3
集合B:
{ "modelB": CCC, "money":1,"age": 18},
1
進行關聯
A.aggregate(
$lookup:{
from: "B",
localField: "modelA",
foreignField: "modelB",
as: newB
}
)
1
2
3
4
5
6
7
8
會得到:
{ "name":a1, "modelA": CCC, "newB":[ { "money":1 , "age": 18 } ]},
{ "name":a2, "modelA": CCC, "newB":[ { "money":1 , "age": 18 } ]},
{ "name":a3, "modelA": DDD, "newB":[] }
1
2
3
更多的$lookup細節功能可以查看:$lookup參考博客文章
————————————————
版權聲明:本文爲CSDN博主「ldz_miantiao」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_40282732/article/details/103135650