[英]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.