MongoDB如何對(duì)數(shù)組中的元素進(jìn)行查詢?cè)斀?/h1>
更新時(shí)間:2017年10月27日 09:22:29 作者:鐵錨
MongoDB在文檔上支持?jǐn)?shù)組,其次數(shù)組上可以實(shí)現(xiàn)嵌套,以及數(shù)組元素也可以文檔。所以下面這篇文章主要給大家介紹了關(guān)于MongoDB如何對(duì)數(shù)組中元素進(jìn)行查詢的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
前言
MongoDB是文檔型數(shù)據(jù)庫(kù),每個(gè)文檔(doc)表示數(shù)據(jù)的一項(xiàng)記錄。相比關(guān)系型DB的row只能使用簡(jiǎn)單的數(shù)據(jù)類(lèi)型,doc能夠使用復(fù)雜的數(shù)據(jù)類(lèi)型:內(nèi)嵌doc,數(shù)組。MongoDB的數(shù)組是一系列元素的集合,使用中括號(hào) [] 表示數(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)算。
請(qǐng)看示例:
假設(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è)條件的語(yǔ)句:
{ "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é)果是, 對(duì)數(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é)果是, 對(duì)數(shù)組進(jìn)行匹配, 其中需要有子元素 滿足 "qList.qid": 1, 還需要有子元素 滿足 "qList.qid": 1, , 適合進(jìn)行單個(gè)條件的匹配。
如果是單個(gè)條件匹配, 則以下方式結(jié)果是一樣的。
{ "qList.qid": 1}
或者
{ "qList": { $elemMatch: { "qid": 1} } }
查詢的結(jié)果都是2條記錄。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
-
MongoDB進(jìn)階之動(dòng)態(tài)字段設(shè)計(jì)詳解
這篇文章主要給大家介紹了MongoDB進(jìn)階之動(dòng)態(tài)字段設(shè)計(jì)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。 2017-06-06
-
MongoDB 3.4配置文件避免入坑的注意事項(xiàng)
最近在配置mongodb的時(shí)候遇到了一些問(wèn)題,現(xiàn)總結(jié)出來(lái)方便以后需要或同樣遇到該問(wèn)題的朋友們參考,下面這篇文章主要給大家介紹了關(guān)于MongoDB 3.4配置文件時(shí)避免入坑的兩個(gè)注意事項(xiàng),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。 2017-09-09
-
MongoDB中單對(duì)象大小超16M的存儲(chǔ)方案
在 MongoDB 中,單個(gè)文檔的大小限制為 16MB,如果某個(gè)對(duì)象(文檔)的大小超過(guò) 16MB該怎么辦,所以本文給大家介紹了MongoDB中單對(duì)象大小超16M的存儲(chǔ)方案,需要的朋友可以參考下 2025-01-01
-
MongoDB運(yùn)行日志實(shí)現(xiàn)自動(dòng)分割的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于MongoDB運(yùn)行日志實(shí)現(xiàn)自動(dòng)分割的方法,文中以一個(gè)MongoDB實(shí)例為例,寫(xiě)了一個(gè)腳本來(lái)實(shí)現(xiàn)自動(dòng)分割MongoDB日志,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。 2017-01-01
-
MongoDB中的常用操作$push、$pushAll和$pull示例詳解
MongoDB從2.2版本開(kāi)始支持$push操作符,$push是用于在數(shù)組中添加一個(gè)元素的更新操作符,它將指定的值追加到數(shù)組的末尾,本文給大家介紹MongoDB的常用操作$push、$pushAll和$pull,感興趣的朋友一起看看吧 2023-12-12
-
初識(shí)NoSQL NoSql數(shù)據(jù)庫(kù)入門(mén) NoSql數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)
大家有沒(méi)有聽(tīng)說(shuō)過(guò)“NoSQL”呢?大家可能會(huì)誤以為是“No!SQL”的縮寫(xiě),但實(shí)際上,它是“Not Only SQL”的縮寫(xiě)。它的意義是:適用關(guān)系型數(shù)據(jù)庫(kù)的時(shí)候就使用關(guān)系型數(shù)據(jù)庫(kù),不適用的時(shí)候也沒(méi)有必要非使用關(guān)系型數(shù)據(jù)庫(kù)不可,可以考慮使用更加合適的數(shù)據(jù)存儲(chǔ)。 2014-08-08
-
MongoDB入門(mén)教程之常用的運(yùn)維技術(shù)介紹
這篇文章主要介紹了MongoDB入門(mén)教程之常用的運(yùn)維技術(shù)介紹,講解了安裝部署、狀態(tài)監(jiān)控、安全認(rèn)證、備份和恢復(fù)等內(nèi)容,需要的朋友可以參考下 2014-08-08
-
MongoDB中的push操作詳解(將文檔插入到數(shù)組)
$push操作符添加指定的值到數(shù)組中,下面這篇文章主要給大家介紹了關(guān)于MongoDB中push操作(將文檔插入到數(shù)組)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下 2022-11-11
最新評(píng)論
前言
MongoDB是文檔型數(shù)據(jù)庫(kù),每個(gè)文檔(doc)表示數(shù)據(jù)的一項(xiàng)記錄。相比關(guān)系型DB的row只能使用簡(jiǎn)單的數(shù)據(jù)類(lèi)型,doc能夠使用復(fù)雜的數(shù)據(jù)類(lèi)型:內(nèi)嵌doc,數(shù)組。MongoDB的數(shù)組是一系列元素的集合,使用中括號(hào) [] 表示數(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)算。
請(qǐng)看示例:
假設(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è)條件的語(yǔ)句:
{ "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é)果是, 對(duì)數(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é)果是, 對(duì)數(shù)組進(jìn)行匹配, 其中需要有子元素 滿足 "qList.qid": 1, 還需要有子元素 滿足 "qList.qid": 1, , 適合進(jìn)行單個(gè)條件的匹配。
如果是單個(gè)條件匹配, 則以下方式結(jié)果是一樣的。
{ "qList.qid": 1}
或者
{ "qList": { $elemMatch: { "qid": 1} } }
查詢的結(jié)果都是2條記錄。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
MongoDB進(jìn)階之動(dòng)態(tài)字段設(shè)計(jì)詳解
這篇文章主要給大家介紹了MongoDB進(jìn)階之動(dòng)態(tài)字段設(shè)計(jì)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-06-06
MongoDB 3.4配置文件避免入坑的注意事項(xiàng)
最近在配置mongodb的時(shí)候遇到了一些問(wèn)題,現(xiàn)總結(jié)出來(lái)方便以后需要或同樣遇到該問(wèn)題的朋友們參考,下面這篇文章主要給大家介紹了關(guān)于MongoDB 3.4配置文件時(shí)避免入坑的兩個(gè)注意事項(xiàng),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。2017-09-09
MongoDB中單對(duì)象大小超16M的存儲(chǔ)方案
在 MongoDB 中,單個(gè)文檔的大小限制為 16MB,如果某個(gè)對(duì)象(文檔)的大小超過(guò) 16MB該怎么辦,所以本文給大家介紹了MongoDB中單對(duì)象大小超16M的存儲(chǔ)方案,需要的朋友可以參考下2025-01-01
MongoDB運(yùn)行日志實(shí)現(xiàn)自動(dòng)分割的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于MongoDB運(yùn)行日志實(shí)現(xiàn)自動(dòng)分割的方法,文中以一個(gè)MongoDB實(shí)例為例,寫(xiě)了一個(gè)腳本來(lái)實(shí)現(xiàn)自動(dòng)分割MongoDB日志,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-01-01
MongoDB中的常用操作$push、$pushAll和$pull示例詳解
MongoDB從2.2版本開(kāi)始支持$push操作符,$push是用于在數(shù)組中添加一個(gè)元素的更新操作符,它將指定的值追加到數(shù)組的末尾,本文給大家介紹MongoDB的常用操作$push、$pushAll和$pull,感興趣的朋友一起看看吧2023-12-12
初識(shí)NoSQL NoSql數(shù)據(jù)庫(kù)入門(mén) NoSql數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)
大家有沒(méi)有聽(tīng)說(shuō)過(guò)“NoSQL”呢?大家可能會(huì)誤以為是“No!SQL”的縮寫(xiě),但實(shí)際上,它是“Not Only SQL”的縮寫(xiě)。它的意義是:適用關(guān)系型數(shù)據(jù)庫(kù)的時(shí)候就使用關(guān)系型數(shù)據(jù)庫(kù),不適用的時(shí)候也沒(méi)有必要非使用關(guān)系型數(shù)據(jù)庫(kù)不可,可以考慮使用更加合適的數(shù)據(jù)存儲(chǔ)。2014-08-08
MongoDB入門(mén)教程之常用的運(yùn)維技術(shù)介紹
這篇文章主要介紹了MongoDB入門(mén)教程之常用的運(yùn)維技術(shù)介紹,講解了安裝部署、狀態(tài)監(jiān)控、安全認(rèn)證、備份和恢復(fù)等內(nèi)容,需要的朋友可以參考下2014-08-08
MongoDB中的push操作詳解(將文檔插入到數(shù)組)
$push操作符添加指定的值到數(shù)組中,下面這篇文章主要給大家介紹了關(guān)于MongoDB中push操作(將文檔插入到數(shù)組)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-11-11

