簡體   English   中英

索引MongoDB數組位置查詢

[英]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.0array.1array.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的ktruev

> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM