MongoDB如何對數(shù)組中的元素進(jìn)行查詢詳解
前言
MongoDB是文檔型數(shù)據(jù)庫,每個(gè)文檔(doc)表示數(shù)據(jù)的一項(xiàng)記錄。相比關(guān)系型DB的row只能使用簡單的數(shù)據(jù)類型,doc能夠使用復(fù)雜的數(shù)據(jù)類型:內(nèi)嵌doc,數(shù)組。MongoDB的數(shù)組是一系列元素的集合,使用中括號 [] 表示數(shù)組,例如:[1,2,3]的元素是整數(shù)值,[{name:"t5"}, {name:"t7"}],[ {name:"t5", age:21}, {name:"t7", age:22} ]的元素是doc。
在MongoDB中,數(shù)組元素允許重復(fù),元素的位置是固定的。如果兩個(gè)數(shù)組相等,那么這兩個(gè)數(shù)組的元素和及其位置都相同。
MongoDB中根據(jù)數(shù)組子元素進(jìn)行匹配,有兩種方式。
- 使用 “[數(shù)組名].[子元素字段名]” 的方式進(jìn)行匹配。
- 使用 “[數(shù)組名]” $elemMatch { [子元素字段名] }的方式。
不同點(diǎn)在于所匹配的主體不同。
“[數(shù)組名].[子元素字段名]” 的方式匹配的主體為 “[數(shù)組名]”, 適用于單個(gè)條件,如果是多個(gè)條件, 則變成數(shù)組子元素之間的“或”運(yùn)算。
請看示例:
假設(shè)某個(gè)集合內(nèi)有2條數(shù)據(jù):
document1 如下:
{ "_id" : "123", "name" : "人文醫(yī)學(xué)", "qList" : [ { "qid" : 1, "content" : "醫(yī)學(xué)倫理學(xué)的公正原則", "reorderFlag" : 1 }, { "qid" : 2, "content" : "制定有關(guān)人體實(shí)驗(yàn)的基本原則", "reorderFlag" : 0 } ] }
document2 如下:
{ "_id" : "124", "name" : "人文醫(yī)學(xué)2", "qList" : [ { "qid" : 1, "content" : "醫(yī)學(xué)倫理學(xué)的公正原則", "reorderFlag" : 0 }, { "qid" : 2, "content" : "制定有關(guān)人體實(shí)驗(yàn)的基本原則", "reorderFlag" : 1 } ] }
找出數(shù)組中, 具有 qid=1并且reorderFlag=0的記錄
查詢數(shù)組內(nèi)同一條記錄同時(shí)滿足2個(gè)條件的語句:
{ "qList": { $elemMatch: { "qid": 1, "reorderFlag": 0} } }
查詢結(jié)果是:
{ "_id" : "124", "name" : "人文醫(yī)學(xué)2", "qList" : [ { "qid" : NumberInt(1), "content" : "醫(yī)學(xué)倫理學(xué)的公正原則", "reorderFlag" : NumberInt(0) }, { "qid" : NumberInt(2), "content" : "制定有關(guān)人體實(shí)驗(yàn)的基本原則", "reorderFlag" : NumberInt(1) } ] }
可以看到, 其執(zhí)行結(jié)果是, 對數(shù)組內(nèi)的每一個(gè)子元素, 執(zhí)行 $elemMatch 匹配, 可以進(jìn)行多個(gè)條件的匹配。
找出數(shù)組中, qid=1 或者 reorderFlag=0的記錄
數(shù)組整體能滿足以下2個(gè)條件:
{ "qList.qid": 1, "qList.reorderFlag": 0}
執(zhí)行的主體是 qList, 要求: 有某些子元素滿足 qid=1, 也要有某些子元素滿足 reorderFlag=0`。
查詢結(jié)果是:
{ "_id" : "123", "name" : "人文醫(yī)學(xué)", "qList" : [ { "qid" : NumberInt(1), "content" : "醫(yī)學(xué)倫理學(xué)的公正原則", "reorderFlag" : NumberInt(1) }, { "qid" : NumberInt(2), "content" : "制定有關(guān)人體實(shí)驗(yàn)的基本原則", "reorderFlag" : NumberInt(0) } ] } { "_id" : "124", "name" : "人文醫(yī)學(xué)2", "qList" : [ { "qid" : NumberInt(1), "content" : "醫(yī)學(xué)倫理學(xué)的公正原則", "reorderFlag" : NumberInt(0) }, { "qid" : NumberInt(2), "content" : "制定有關(guān)人體實(shí)驗(yàn)的基本原則", "reorderFlag" : NumberInt(1) } ] }
可以看到, 其執(zhí)行結(jié)果是, 對數(shù)組進(jìn)行匹配, 其中需要有子元素 滿足 "qList.qid": 1, 還需要有子元素 滿足 "qList.qid": 1, , 適合進(jìn)行單個(gè)條件的匹配。
如果是單個(gè)條件匹配, 則以下方式結(jié)果是一樣的。
{ "qList.qid": 1}
或者
{ "qList": { $elemMatch: { "qid": 1} } }
查詢的結(jié)果都是2條記錄。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
MongoDB中的push操作詳解(將文檔插入到數(shù)組)
$push操作符添加指定的值到數(shù)組中,下面這篇文章主要給大家介紹了關(guān)于MongoDB中push操作(將文檔插入到數(shù)組)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11MongoDB安裝到windows服務(wù)的方法及遇到問題的完美解決方案
這篇文章主要介紹了MongoDB安裝到windows服務(wù)的方法及遇到問題的完美解決方案,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11windows下安裝mongodb以及node.js連接mongodb實(shí)例
本篇文章主要介紹了windows下安裝mongodb以及node.js連接mongodb實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05在mac系統(tǒng)下安裝與配置mongoDB數(shù)據(jù)庫
這篇文章主要介紹了在mac系統(tǒng)下安裝與配置mongoDB數(shù)據(jù)庫的操作步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-09-09mongodb索引知識_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章給大家介紹了mongodb索引的建立,刪除索引的方法以及唯一索引和組合索引的知識,感興趣的朋友一起看看吧2017-08-08mongodb 實(shí)現(xiàn)遠(yuǎn)程連接
這篇文章主要介紹了mongodb 實(shí)現(xiàn)遠(yuǎn)程連接,需要的朋友可以參考下2014-07-07深究從MongoDB的ObjectId中獲取時(shí)間信息
MongoDB默認(rèn)使用_id字段作為主鍵,類型為ObjectId。ObjectId的生成有一定的規(guī)則,詳情可以查看這篇文章MongoDB深究之ObjectId2017-03-03