[英]Indexing MongoDB array position queries
我想建立一個索引,以支持對特定數組元素位置的查詢。
給定數百萬個具有值數組的文檔:
db.foo.insert({ array: [true, false, null, true] })
db.foo.insert({ array: [false, null, true, true] })
我想搜索位置2為true
文檔。
db.foo.find({ "array.2": true })
如果我創建一個多鍵索引:
db.foo.createIndex({ array: 1 })
該索引支持以下形式的查詢: { "array": true }
(搜索所有數組元素),但不支持{ "array.2": true }
(搜索特定數組元素)。
該文檔說“ MongoDB為數組中的每個元素創建一個索引鍵”,因此我期望如果我在array
字段上創建索引,則該索引將用於對array.0
, array.1
, array.2
查詢。 ,等等。有一個技巧可以使它正常工作嗎?
MongoDB的多鍵索引僅索引數組的值,而不索引所述值在數組中的位置。
話雖如此,有一種可能的解決方法來滿足您的要求。
您不僅需要存儲數組的值,還需要存儲一個顯示元素位置的“鍵”。 使用您的示例:
> db.test.find()
{
"_id": 0,
"a": [
{"k": 0, "v": true},
{"k": 1, "v": false},
{"k": 2, "v": null},
{"k": 3, "v": true}
]
}
{
"_id": 1,
"a": [
{"k": 0, "v": false},
{"k": 1, "v": null},
{"k": 2, "v": true},
{"k": 3, "v": true}
]
}
請注意,在上面的示例中,我使用的子文檔中的字段k
表示“數組位置”,字段v
用來存儲“數組元素”。
然后,您可以創建索引兩個字段的索引:
db.test.createIndex({'a.k':1, 'a.v':1})
該查詢應使用$ elemMatch運算符來確保整個子文檔匹配。 假設您要搜索2的k
和true
的v
:
> db.test.find({a: {$elemMatch: {k:2, v:true}}})
{
"_id": 1,
"a": [
{"k": 0, "v": false},
{"k": 1, "v": null},
{"k": 2, "v": true},
{"k": 3, "v": true}
]
}
這種方法的一個缺點是您需要對k
字段進行自己的內務處理。 插入到數組中會更加復雜,因為如果您想將k
視為數組索引,則必須在執行$push
之前知道k
最大值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.