久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MongoDB增刪改查之查詢怎么實現

197次閱讀
沒有評論

共計 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 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-24發表,共計6680字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 灵璧县| 会同县| 手机| 江安县| 花垣县| 曲水县| 来宾市| 西青区| 尼玛县| 开原市| 洱源县| 亳州市| 同仁县| 平塘县| 当涂县| 万州区| 利辛县| 上蔡县| 华宁县| 吉木乃县| 阳泉市| 涟源市| 老河口市| 措勤县| 久治县| 新竹市| 大港区| 龙川县| 天台县| 大余县| 阜南县| 穆棱市| 晋州市| 香格里拉县| 凤庆县| 津市市| 五家渠市| 安顺市| 龙泉市| 囊谦县| 永定县|