共計 6680 個字符,預計需要花費 17 分鐘才能閱讀完成。
這篇文章主要介紹 MongoDB 增刪改查之查詢怎么實現,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
詳述 1. 簡單查詢:
db.t1.find()
{ _id : ObjectId( 585ce007d993c80e8713c7bd), x : 1, j : 1 }
{ _id : ObjectId( 585ce007d993c80e8713c7be), x : 4, j : 2 }
{ _id : ObjectId( 585ce007d993c80e8713c7bf), x : 2, j : 3 }
{ _id : ObjectId( 585ce008d993c80e8713c7c0), x : 4, j : 4 }
{ _id : ObjectId( 585ce023d993c80e8713c7c2), x : 3 }
2. 排序查詢:
db.t1.find().sort({j:-1}) --- 1 表示升序,“-1”表示降序
{ _id : ObjectId( 585ce008d993c80e8713c7c0), x : 4, j : 4 }
{ _id : ObjectId( 585ce007d993c80e8713c7bf), x : 2, j : 3 }
{ _id : ObjectId( 585ce007d993c80e8713c7be), x : 4, j : 2 }
{ _id : ObjectId( 585ce007d993c80e8713c7bd), x : 1, j : 1 }
{ _id : ObjectId( 585ce023d993c80e8713c7c2), x : 3 }
3. 條件查詢:
db.t1.find({x:2})
{ _id : ObjectId( 585ce007d993c80e8713c7bf), x : 2, j : 3 }
4. 多條件查詢
db.t1.find({x:2,j:3})
{ _id : ObjectId( 585ce007d993c80e8713c7bf), x : 2, j : 3 }
5. 比較條件查詢
db.t1.find({j:{$gt:2,$lte:4}}) --- 查詢 j 字段大于 2,小于等于 4 的記錄
{ _id : ObjectId( 585ce007d993c80e8713c7bf), x : 2, j : 3 }
{ _id : ObjectId( 585ce008d993c80e8713c7c0), x : 4, j : 4 }
比較運算符:
$gt: 大于
$lt: 小于
$gte: 大于等于
$lte: 小于等于
$ne:不等于
6. 多個值 in 查詢(類似 IN)
db.t1.find({j:{$in:[1,4]}}) ---j= 1 或 j = 4 的記錄,不包括可以用 $nin
{ _id : ObjectId( 585ce007d993c80e8713c7bd), x : 1, j : 1 }
{ _id : ObjectId( 585ce008d993c80e8713c7c0), x : 4, j : 4 }
7. 多個值 and 查詢(類似 AND)
db.t1.find({x:1,j:{$gt:1}}) ---x=1 and j 1 條件記錄
{ _id : ObjectId( 585ce007d993c80e8713c7be), x : 1, j : 2 }
{ _id : ObjectId( 585ce007d993c80e8713c7bf), x : 1, j : 3 }
8. 多個值 or 查詢(類似 OR)
db.t1.find({$or:[{x:4},{j:{$lte:2}}]}) ---x=4 or j = 2 的條件記錄
{ _id : ObjectId( 585ce007d993c80e8713c7bd), x : 1, j : 1 }
{ _id : ObjectId( 585ce007d993c80e8713c7be), x : 1, j : 2 }
{ _id : ObjectId( 585ce008d993c80e8713c7c0), x : 4, j : 4 }
9. 多個值 or and 查詢
db.t1.find({x:1,$or:[{j:{$lt:2}},{j:3}]}) ---x=1 and (j 2 or j=3)
{ _id : ObjectId( 585ce007d993c80e8713c7bd), x : 1, j : 1 }
{ _id : ObjectId( 585ce007d993c80e8713c7bf), x : 1, j : 3 }
10. 查詢表中不包括 j 字段的記錄
db.t6.find({j:{$exists:false}}) --- 查詢包含 j 字段的話,就是 $exists:true
{ _id : ObjectId( 585ce023d993c80e8713c7c2), x : 3 }
11. 只返回某個字段或某些字段
db.t1.find({x:4},{j:1}) --- 默認顯示所有字段值,第二個大括號使用 j:1 表示只返回 j 字段,但主鍵_id 默認顯示
{ _id : ObjectId( 585ce008d993c80e8713c7c0), j : 4 }
{ _id : ObjectId( 585ce007d993c80e8713c7be), j : 2 }
12. 如何想要消除主鍵_id 的返回
db.t1.find({x:4},{j:1,_id:0})
{ j : 4 }
{ j : 2 }
嵌套子文檔查詢
原數據表:
db.t6.find()
{ _id : 1, x : 2, kk : { deviceID : 222, city : Tianjin } }
{ _id : 2, x : 3, kk : { deviceID : 333, city : Beijing } }
{ _id : 3, x : 2, kk : { deviceID : 234 } }
查詢嵌套子文檔中的字段,可以用點來連接外字段與內嵌字段,可能不太明白是什么意思,沒關系,直接看如下舉例即可明白;
13. 根據子文檔中某幾個字段的值進行匹配查詢:
db.t6.find({kk:{deviceID:222,city: Tianjin}}) --- 查詢 kk 子文檔中 deviceID=222 且 city: Tianjin 的記錄
{ _id : 1, x : 2, kk : { deviceID : 222, city : Tianjin } }
或者使用如下形式
db.t6.find({kk.deviceID :222, kk.city : Tianjin}) --- 與上一個方法一樣的效果,注意雙引號的使用
{ _id : 1, x : 2, kk : { deviceID : 222, city : Tianjin } }
14. 查詢嵌套文檔中不存在 city 字段得數據
db.getCollection(t6).find({kk.city :{$exists:false}})
{ _id : 3, x : 2, kk : { deviceID : 234 } }
15. 查詢結果只想返回子文檔中的某些字段值
db.t6.find({},{ kk.deviceID :1,_id:0})
{ kk : { deviceID : 222 } }
{ kk : { deviceID : 333 } }
{ kk : { deviceID : 234 } }
另:當然關于嵌套子文檔還有更多更復雜的查詢語句,主要還是看你嵌套文檔中的數據結構而定,結構越復雜,那么需要寫的查詢語句就越復雜。
數組查詢
MongoDB 中數組的查詢也是比較繁瑣的,因為畢竟其他關系型數據庫中不包含此種數據類型。不過沒關系,我盡量將我能想到的場景羅列于此,方便你我查找。
原數據表:
db.t5.find()
{ _id : 1, x : 2, Course : [ English , Math ], score : [ 1, 3 ] }
{ _id : 2, x : 3, Course : [ Math , English ], score : [ 18, 12 ] }
{ _id : 3, x : 4, Course : [ English ], score : [ 98, 1 ] }
{ _id : 4, x : 5, Course : [ Yuwen , English ], score : [ 45, 46 ] }
{ _id : 5, x : 7, Course : [ Math ], score : [ 99, 100 ] }
16. 精確查詢數組中元素
要求:使用 {field : value} 形式;
舉例 1:匹配一個元素
db.t5.find({Course: Math}) --- 查詢到的是所有包含“Math”元素的行
{ _id : 1, x : 2, Course : [ English , Math ], score : [ 1, 3 ] }
{ _id : 2, x : 3, Course : [ Math , English ], score : [ 18, 12 ] }
{ _id : 5, x : 7, Course : [ Math ], score : [ 99, 100 ] }
舉例 2:精確查詢多元素
db.t5.find({Course:[ Math , English]})
{ _id : 2, x : 3, Course : [ Math , English ], score : [ 18, 12 ] }
注意: 上述語句只會查詢到一行,而另外一筆也包含“Math”和“English”的數據雖然包含的元素一樣,但是元素順序不一致。所以未被列出
舉例 3:精確查詢一個元素(按元素位置)
db.t5.find({Course.1 : English}) --- 精確查詢數組中第 2 個元素是“English”{ _id : 2, x : 3, Course : [ Math , English ], score : [ 18, 12 ] }
{ _id : 4, x : 5, Course : [ Yuwen , English ], score : [ 45, 46 ] }
17. 指定多條件查詢數組
要求:使用 $elemMatch 操作符;
舉例 1:只要求數組中有一個元素滿足所有條件
db.t5.find({score:{$elemMatch:{$gt:15,$lt:20}}}) --- 也就只有 18 15, 且 18 20
{ _id : 2, x : 3, Course : [ Math , English ], score : [ 18, 12 ] }
舉例 2:要求數組中各個元素只滿足一部分篩選條件,但是組合起來可以滿足所有條件
db.t5.find({score:{$gt:15,$lt:20}})
{ _id : 2, x : 3, Course : [ Math , English ], score : [ 18, 12 ] }
{ _id : 3, x : 4, Course : [ English ], score : [ 98, 1 ] }
另:上述舉例,你可能會迷糊,為什么 [98,1] 可以入選呢?因為 1 20,且 98 15,所以滿足查詢條件,明白了吧?
18. 獲取數組字段的數組長度
db.t5.find({_id:5}).forEach(function(x){
var score=x.score;
var scoreLenth=score.length;
print(scoreLenth);
2 --- 返回結果
查看數組不為空:
db.t9.find({arrary:{$elemMatch:{$ne:null}})
正則表達式
db.t4.find()
{ _id : ObjectId( 58aa8e4c151e4fd0af703688), name : Jack , addr : tianjin }
{ _id : ObjectId( 58aa8e5e151e4fd0af703689), name : Tom , addr : beijing }
{ _id : ObjectId( 58aa9c25151e4fd0af70368a), name : Nick J }
19. 查詢 name 以 J 開頭的記錄
db.t4.find({name:/^J/}) --- 查詢以 J 開頭的記錄
{ _id : ObjectId( 58aa8e4c151e4fd0af703688), name : Jack , addr : tianjin }
20. 查詢不以 J 開頭的記錄
db.t4.find({name:{$not:/^J/}}) --- 查詢不以 J 開頭的記錄
{ _id : ObjectId( 58aa8e5e151e4fd0af703689), name : Tom , addr : beijing }
{ _id : ObjectId( 58aa9c25151e4fd0af70368a), name : Nick J }
21. 查詢 name 重包含 J 的記錄
db.t4.find({name:/J/}) --- 查詢 name 重包含 J 的記錄
{ _id : ObjectId( 58aa8e4c151e4fd0af703688), name : Jack , addr : tianjin }
{ _id : ObjectId( 58aa9c25151e4fd0af70368a), name : Nick J }
查詢 Null 或者不存在的字段
原集合數據:
db.t8.find()
{ _id : 99, name : null }
{ _id : 100 }
22. 查詢 name:null 的記錄:
db.t8.find({name:null}) --- 出現這樣的結果,是因為這樣的查詢方式會返回 name=null 且不存在 name 字段的記錄
{ _id : 99, name : null }
{ _id : 100 }
23. 只查詢 name:null 的數據,不包含 name 字段的不返回
db.t8.find({name:{$type:10}}) --- 可以使用 $type,10 其實就代表了 null 這個數據類型
{ _id : 99, name : null }
24. 只返回不包含 name 字段的數據
db.t8.find({name:{$exists:false}}) --- 如果只查詢存在 name 字段的記錄,則 $exists:true
{ _id : 100 }
迭代查詢
find()查詢之后返回的是一個 cursor 游標,在 mongo shell 默認情況下迭代 20 次顯示前 20 個文檔記錄
如果使用變量迭代結果集的話:
var a=db.t6.find() --- 定義變量
while(a.hasNext()){ --- 判斷變量游標位置
... printjson(a.next()); --- 打印游標內容
... }
{ _id : 1, x : 2, kk : { deviceID : 222, city : Tianjin } }
{ _id : 2, x : 2, kk : { deviceID : 222, addr : Heping } }
或者使用 forEach()
var a=db.t6.find()
a.forEach(printjson)
{ _id : 1, x : 2, kk : { deviceID : 222, city : Tianjin } }
{ _id : 2, x : 2, kk : { deviceID : 222, addr : Heping } }
使用 toArry()逐一查詢結果集
var a=db.t6.find() --- 定義變量
var doc=a.toArray() --- 使用 toArray()生成數組結果集
doc[0] --- 查詢結果集中第一個文檔
{ _id : 1, x : 2, kk : { deviceID : 222, city : Tianjin } }
以上是“MongoDB 增刪改查之查詢怎么實現”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!