详细的mongo工具手册,包含常见CURD+条件操作+聚合+案例
詳細的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
總結
以上是生活随笔為你收集整理的详细的mongo工具手册,包含常见CURD+条件操作+聚合+案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 短视频未来3年的规模为3万亿元
- 下一篇: 王者荣耀全栈项目部署到阿里云服务器笔记