MongoDB:查找后的操作需要很长时间
我在使用大型集合进行聚合$lookup时遇到了速度问题 这里有两个请求。两者都是在一个$match上。这个操作非常快。然后我进行$lookup,这也很快 之后,我对$lookup结果执行一个操作。在第一种情况下,此操作非常快,而在第二种情况下,此操作非常慢 第一个快速请求:MongoDB:查找后的操作需要很长时间,mongodb,Mongodb,我在使用大型集合进行聚合$lookup时遇到了速度问题 这里有两个请求。两者都是在一个$match上。这个操作非常快。然后我进行$lookup,这也很快 之后,我对$lookup结果执行一个操作。在第一种情况下,此操作非常快,而在第二种情况下,此操作非常慢 第一个快速请求: db.getCollection('table1').aggregate([ { "$match": { "type": "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"
}
}
])
第二个缓慢的请求:
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
将非常慢。是的,在管道的这个阶段,你不能使用索引。太宽了。因为在第二个查询中,您正在处理额外的筛选