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 字段的子文档来表示"array position",并使用字段 v 来存储"array element" .
然后,您可以创建索引两个字段的索引:
db.test.createIndex({'a.k':1, 'a.v':1})
查询应该使用$elemMatch operator来确保整个子文档匹配 . 让's say you'重新搜索 k 的2和 v 的 true :
> 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 的最高值 .