MongoDB:查找后的操作需要很长时间

MongoDB:查找后的操作需要很长时间,mongodb,Mongodb,我在使用大型集合进行聚合$lookup时遇到了速度问题 这里有两个请求。两者都是在一个$match上。这个操作非常快。然后我进行$lookup,这也很快 之后,我对$lookup结果执行一个操作。在第一种情况下,此操作非常快,而在第二种情况下,此操作非常慢 第一个快速请求: db.getCollection('table1').aggregate([ { "$match": { "type": "test", } },

我在使用大型集合进行聚合$lookup时遇到了速度问题

这里有两个请求。两者都是在一个$match上。这个操作非常快。然后我进行$lookup,这也很快

之后,我对$lookup结果执行一个操作。在第一种情况下,此操作非常快,而在第二种情况下,此操作非常慢

第一个快速请求:

db.getCollection('table1').aggregate([
    {
        "$match": {
            "type": "test",
        }
    },
    {
        "$lookup": {
            "from": "table2",
            "localField": "name",
            "foreignField": "name",
            "as": "lookup_names"
        }
    },
    {
        "$project": {
            "names": {
                // reduce on lookup_names is very fast
                "$reduce": {
                    "input": "$lookup_names",
                    "initialValue": ""
                    "in": {
                        "$concat": ["$$value.name", ".", "$$this.name"]
                    }
                }
            }
        }
    }
])
db.getCollection('table1').aggregate([
    {
        "$match": {
            "type": "test"
        }
    },
    {
        "$lookup": {
            "from": "table2",
            "localField": "name",
            "foreignField": "name",
            "as": "lookup_names"
        }
    },
    {
        // match on lookup_names is very slow
        "$match": {
            "lookup_names.name": "test"
        }
    }
])
第二个缓慢的请求:

db.getCollection('table1').aggregate([
    {
        "$match": {
            "type": "test",
        }
    },
    {
        "$lookup": {
            "from": "table2",
            "localField": "name",
            "foreignField": "name",
            "as": "lookup_names"
        }
    },
    {
        "$project": {
            "names": {
                // reduce on lookup_names is very fast
                "$reduce": {
                    "input": "$lookup_names",
                    "initialValue": ""
                    "in": {
                        "$concat": ["$$value.name", ".", "$$this.name"]
                    }
                }
            }
        }
    }
])
db.getCollection('table1').aggregate([
    {
        "$match": {
            "type": "test"
        }
    },
    {
        "$lookup": {
            "from": "table2",
            "localField": "name",
            "foreignField": "name",
            "as": "lookup_names"
        }
    },
    {
        // match on lookup_names is very slow
        "$match": {
            "lookup_names.name": "test"
        }
    }
])

有人能解释一下为什么第二个请求很慢吗?也许能给我一个更快的解决方案?

他们做的不是同一件事。所以基本上他们根本不比较。示例中的
$match
是选择“文档”而不是“数组成员”(通常是错误的)。
$reduce
只作用于每个文档中的“数组成员”。同样,快速和慢速在没有上下文的情况下都是主观的。但是,例如,如果您有几百万个文档,那么非索引字段上的
$match
将非常慢。是的,在管道的这个阶段,你不能使用索引。太宽了。因为在第二个查询中,您正在处理额外的筛选