校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > MongoDB操作符中的$elemMatch問題

MongoDB操作符中的$elemMatch問題

熱門標簽:crm外呼系統聯系方式 智能外呼系統官網 青白江400企業電話申請 內蒙古營銷智能外呼系統哪個好 呼和浩特外呼系統原理是什么 小裙科技電銷機器人怎樣 外呼線路資源屬于電信業務嗎 長沙電銷外呼防封卡是什么 河南電話外呼系統招商

問題

如果MongoDB 數據庫集合中僅存在一條記錄

{
  "_id" : ObjectId("5e6b4ef546b5f44e5c5b276d"),
  "name" : "趙小明",
  "used_name" : [ 
    "趙明", 
    "趙小朋"
  ],
  "age" : 16,
  "gender" : 0,
  "relatives" : [ 
    {
      "name" : "趙剛",
      "relationship" : 0
    }, 
    {
      "name" : "秀英",
      "relationship" : 1
    }
  ]
}

我們執行查詢

db.getCollection('Persion').find({"relatives.name": "趙剛", "relatives.relationship": 1})

此時會得到結果嗎?

最開始我想當然的以為是不會出現結果的,但結果往往與期望背道而馳。

什么,一瞬間我陷入了迷茫,Mongo的查詢結果不是必須都滿足所有條件的嗎?

分析

不信邪的我又嘗試了喜聞樂見的小白查詢

db.getCollection('Persion').find({"name": "趙小明", "age": 18})

這次結果為空,嗯,這才是我熟悉的Mongo嘛?

那這兩次查詢有啥區別呢?不同有兩點

  • 是否為二級字段
  • 是否為數組

那我們將數據改為

{
  "_id" : ObjectId("5e6b4ef546b5f44e5c5b276d"),
  "name" : "趙小明",
  "used_name" : [ 
    "趙明", 
    "趙小朋"
  ],
  "age" : 16,
  "gender" : 0,
  "relative" : {
    "name" : "趙剛",
    "relationship" : 0
  }
}

繼續執行查詢

db.getCollection('Persion').find({"relatives.name": "趙剛", "relatives.relationship": 1})

此次結果為空集

接下來嘗試查詢

db.getCollection('Persion').find({"relatives.name": "趙剛", "relatives.relationship": 0})

此次可得到一條結果

通過上述兩次查詢基本可以排除二級字段的影響

那就是數組的原因了,那具體是為什么呢?

將數據還原為最初的格式,繼續進行不同的查詢

db.getCollection('Persion').find({"relatives.name": "趙剛", "relatives.relationship": 2})

此次結果為空集

那我們可以得到結論,對于數組字段,每個查詢條件僅需有數組中的一項滿足條件即可,而不是數組中必須存在一項滿足所有查詢條件。

那如果我想達到后面的效果要怎么做呢?

解決

此時,我們需要用到我們今天的主角 $elemMatch ,它的官方定義是這樣的:

The $elemMatch operator matches documents that contain an array field with at least one element that matches all the specified query criteria.

{ field>: { $elemMatch: { query1>, query2>, ... } } }
If you specify only a single condition in the $elemMatch expression, you do not need to use $elemMatch.

You cannot specify a $where expression in an $elemMatch.
You cannot specify a $text query expression in an $elemMatch.

那上邊的查詢我們可以改成

db.getCollection('Persion').find({"relatives":{"$elemMatch":{"name": "趙四", "relationship": 0}}})

此時可以得到結果,但

db.getCollection('Persion').find({"relatives":{"$elemMatch":{"name": "趙四", "relationship": 1}}})

結果為空集

結語

此操作符和索引也有一些不得不說的事,今天就不在這里細說了,之后我會專門總結一篇有關MongoDB索引相關的博客

等不及的看官可以自行百度Google一下。

總結

到此這篇關于MongoDB操作符之$elemMatch的文章就介紹到這了,更多相關MongoDB操作符之$elemMatch內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MongoDB 管道的介紹及操作符實例
  • 基于MongoDB數據庫的數據類型和$type操作符詳解

標簽:呼倫貝爾 舟山 安順 池州 菏澤 黃石 白山 楚雄

巨人網絡通訊聲明:本文標題《MongoDB操作符中的$elemMatch問題》,本文關鍵詞  MongoDB,操作,符,中的,elemMatch,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MongoDB操作符中的$elemMatch問題》相關的同類信息!
  • 本頁收集關于MongoDB操作符中的$elemMatch問題的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 彭山县| 磐安县| 南和县| 万源市| 肇源县| 乌鲁木齐县| 玉环县| 普格县| 冷水江市| 北海市| 翁牛特旗| 汶川县| 杭锦旗| 云龙县| 金昌市| 英德市| 峨眉山市| 新田县| 吴江市| 城步| 广水市| 乐至县| SHOW| 兰州市| 定兴县| 通道| 安仁县| 绥阳县| 垦利县| 台湾省| 武功县| 洪泽县| 新疆| 樟树市| 香港 | 潜山县| 榆社县| 甘泉县| 正镶白旗| 渭南市| 蒲城县|