濮阳杆衣贸易有限公司

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

MongoDB操作符中的$elemMatch問題

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

問題

如果MongoDB 數(shù)據(jù)庫集合中僅存在一條記錄

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

我們執(zhí)行查詢

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

此時會得到結果嗎?

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

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

分析

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

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

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

那這兩次查詢有啥區(qū)別呢?不同有兩點

  • 是否為二級字段
  • 是否為數(shù)組

那我們將數(shù)據(jù)改為

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

繼續(xù)執(zhí)行查詢

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

此次結果為空集

接下來嘗試查詢

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

此次可得到一條結果

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

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

將數(shù)據(jù)還原為最初的格式,繼續(xù)進行不同的查詢

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

此次結果為空集

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

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

解決

此時,我們需要用到我們今天的主角 $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內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

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

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

巨人網(wǎng)絡通訊聲明:本文標題《MongoDB操作符中的$elemMatch問題》,本文關鍵詞  MongoDB,操作,符,中的,elemMatch,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MongoDB操作符中的$elemMatch問題》相關的同類信息!
  • 本頁收集關于MongoDB操作符中的$elemMatch問題的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    广汉市| 雅江县| 龙岩市| 来凤县| 西华县| 南乐县| 肇东市| 丰镇市| 武功县| 璧山县| 大埔县| 淮南市| 贡嘎县| 余姚市| 达孜县| 扎鲁特旗| 清新县| 莱阳市| 镇康县| 阿尔山市| 辉南县| 彭山县| 宾川县| 宁晋县| 开鲁县| 广德县| 京山县| 雷山县| 潢川县| 凉城县| 金塔县| 易门县| 泸州市| 寿宁县| 大港区| 罗甸县| 嘉兴市| 祁阳县| 琼结县| 铜陵市| 沂源县|