a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 數(shù)據(jù)庫(kù) > MongoDB > 正文

MongoDB操作符中的$elemMatch問(wèn)題

2020-10-29 18:40:37
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

問(wèn)題

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

{  "_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})

此時(shí)會(huì)得到結(jié)果嗎?

最開(kāi)始我想當(dāng)然的以為是不會(huì)出現(xiàn)結(jié)果的,但結(jié)果往往與期望背道而馳。

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

分析

不信邪的我又嘗試了喜聞樂(lè)見(jiàn)的小白查詢

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

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

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

  • 是否為二級(jí)字段
  • 是否為數(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})

此次結(jié)果為空集

接下來(lái)嘗試查詢

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

此次可得到一條結(jié)果

通過(guò)上述兩次查詢基本可以排除二級(jí)字段的影響

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

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

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

此次結(jié)果為空集

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

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

解決

此時(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}}})

此時(shí)可以得到結(jié)果,但

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

結(jié)果為空集

結(jié)語(yǔ)

此操作符和索引也有一些不得不說(shuō)的事,今天就不在這里細(xì)說(shuō)了,之后我會(huì)專門(mén)總結(jié)一篇有關(guān)MongoDB索引相關(guān)的博客

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

總結(jié)

到此這篇關(guān)于MongoDB操作符之$elemMatch的文章就介紹到這了,更多相關(guān)MongoDB操作符之$elemMatch內(nèi)容請(qǐng)搜索武林網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持武林網(wǎng)!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 成人黄大片视频在线观看 | 秋霞a级毛片在线看 | 欧美视频亚洲视频 | 日韩欧美在线中文字幕 | 毛片免费在线观看 | 六月婷婷综合 | 美女黄色在线观看 | 国产精品一区二区欧美 | 国产suv精品一区二区六 | 欧美国产视频 | 91精品国产综合久久久久久蜜月 | 欧美激情在线播放 | 日韩国产欧美视频 | 羞羞色影院| 国产精品成人品 | 日韩精品在线免费观看视频 | 欧美日韩国产综合视频 | www.久久| 奇米av| www视频在线观看 | 亚洲视频中文字幕 | 自拍偷拍视频网站 | 成人在线一区二区 | 亚洲免费一区二区 | 久久韩剧网 | 一区二区三区国产好 | 日本一级二级三级久久久 | 精品国偷自产国产一区 | 亚洲狠狠 | 色.com| 亚洲欧美日韩另类精品一区二区三区 | 国产成人免费视频 | 国产精品久久久久高潮色老头 | 中文字幕亚洲二区 | 香蕉久久一区二区不卡无毒影院 | 国产精品视频不卡 | 精品在线播放 | 国产在线小视频 | 久久美女| 国产成人a v | 久久久久久久久蜜桃 |