小编mic*_*els的帖子

使用$ all和$ elemMatch时,MongoDB会扫描整个索引

我有一组用户文档,每个用户可以拥有一组任意属性.每个用户都与应用文档相关联.这是一个示例用户:

{
    "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)

indexing performance mongodb

10
推荐指数
1
解决办法
554
查看次数

标签 统计

indexing ×1

mongodb ×1

performance ×1