我有一组用户文档,每个用户可以拥有一组任意属性.每个用户都与应用文档相关联.这是一个示例用户:
{
"appId": "XXXXXXX",
"properties": [
{ "name": "age", "value": 30 },
{ "name": "gender", "value": "female" },
{ "name": "alive", "value": true }
]
}
Run Code Online (Sandbox Code Playgroud)
我希望能够根据用户的属性值查找/计算用户.例如,找到app X的所有用户,其属性Y> 10且Z等于true.
我在这个集合上有一个复合,多键索引db.users.ensureIndex({ "appId": 1, "properties.name": 1, "properties.value": 1})
.该索引适用于单个条件查询,例如:
db.users.find({
appId: 'XXXXXX',
properties: {
$elemMatch: {
name: 'age',
value: {
$gt: 10
}
}
}
})
Run Code Online (Sandbox Code Playgroud)
上述查询在<300ms内完成,包含1M用户的集合.但是,当我尝试添加第二个条件时,性能会大幅下降(7-8s),explain()
输出表明正在扫描整个索引以完成查询("nscanned" : 2752228
).
询问
db.users.find({
appId: 'XXXXXX',
properties: {
$all: [
{
$elemMatch: {
name: 'age',
value: {
$gt: 10
} …
Run Code Online (Sandbox Code Playgroud)