詳細的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章