原文鏈接:http://blog.csdn.net/renfufei/article/details/78320176
MongoDB中根據數組子元素進行匹配,有兩種方式。
- 使用 “[數組名].[子元素字段名]” 的方式進行匹配。
- 使用 “[數組名]” $elemMatch { [子元素字段名] }的方式。
不同點在於所匹配的主體不同。
“[數組名].[子元素字段名]” 的方式匹配的主體為 “[數組名]”, 適用於單個條件,如果是多個條件, 則變成數組子元素之間的“或”運算。
請看示例:
假設某個集合內有2條數據:
document1 如下:
{
"_id" : "123", "name" : "人文醫學", "qList" : [ { "qid" : 1, "content" : "醫學倫理學的公正原則", "reorderFlag" : 1 }, { "qid" : 2, "content" : "制定有關人體實驗的基本原則", "reorderFlag" : 0 } ] }
document2如下:
{ "_id" : "124", "name" : "人文醫學2", "qList" : [ { "qid" : 1, "content" : "醫學倫理學的公正原則", "reorderFlag" : 0 }, { "qid" : 2, "content" : "制定有關人體實驗的基本原則", "reorderFlag" : 1 } ] }
找出數組中, 具有 qid=1並且reorderFlag=0的記錄
查詢數組內同一條記錄同時滿足2個條件的語句:
{ "qList": { $elemMatch: { "qid": 1, "reorderFlag": 0} } }
查詢結果是:
{ "_id" : "124", "name" : "人文醫學2", "qList" : [ { "qid" : NumberInt(1), "content" : "醫學倫理學的公正原則", "reorderFlag" : NumberInt(0) }, { "qid" : NumberInt(2), "content" : "制定有關人體實驗的基本原則", "reorderFlag" : NumberInt(1) } ] }
可以看到, 其執行結果是, 對數組內的每一個子元素, 執行 $elemMatch 匹配, 可以進行多個條件的匹配。
找出數組中, qid=1 或者 reorderFlag=0的記錄
數組整體能滿足以下2個條件:
{ "qList.qid": 1, "qList.reorderFlag": 0}
執行的主體是 qList, 要求: 有某些子元素滿足 qid=1, 也要有某些子元素滿足 reorderFlag=0`。
查詢結果是:
{ "_id" : "123", "name" : "人文醫學", "qList" : [ { "qid" : NumberInt(1), "content" : "醫學倫理學的公正原則", "reorderFlag" : NumberInt(1) }, { "qid" : NumberInt(2), "content" : "制定有關人體實驗的基本原則", "reorderFlag" : NumberInt(0) } ] } { "_id" : "124", "name" : "人文醫學2", "qList" : [ { "qid" : NumberInt(1), "content" : "醫學倫理學的公正原則", "reorderFlag" : NumberInt(0) }, { "qid" : NumberInt(2), "content" : "制定有關人體實驗的基本原則", "reorderFlag" : NumberInt(1) } ] }
可以看到, 其執行結果是, 對數組進行匹配, 其中需要有子元素 滿足 "qList.qid": 1, 還需要有子元素 滿足 "qList.qid": 1, , 適合進行單個條件的匹配。
如果是單個條件匹配, 則以下方式結果是一樣的。
{ "qList.qid": 1}
或者
{ "qList": { $elemMatch: { "qid": 1} } }
查詢的結果都是2條記錄