我有以下聚合管道需要大约5 秒(!!)才能完成。
我尝试在client_id和list字段上使用索引,但它仍然在430ms到4217ms之间完成。此外,如果我发出超过30个并发请求,它会开始生成一些错误并锁定。
如何优化它?
Schema.aggregate(
[
{
$match: { $or: [
{ list: null, owner: new ObjectId(req.user.id) },
{ list: { $in: lists.map(function(id){ return new ObjectId(id); }) } }
],
client_id: req.user.active_client_id
}
},
{
$group: {_id: { parent: "$parent" }, subjobs: { $push: '$$ROOT'}, count:{ $sum: 1}}
},
{
$project: { _id: "$_id.parent", subjobs: 1 }
}
]
)
它使用以下配置针对数据库运行:
1GB SSD
收集文件: 6K
数据大小: 10.6MB
示例文档:
{
_id: ObjectId("554be66d17da350e00e1dde0"),
last_update: ISODate("2015-10-13T13:49:06.961Z"),
title: "SAMPLE DATA",
owner: null,
list: ObjectId("556dca89a5447c0e000afdfe"),
events: [ARRAY OF OBJECTS],
chat: [ARRAY OF OBJECTS],
tags: [ARRAY OF OBJECTS],
date_created: ISODate("2015-05-07T22:25:49.629Z"),
completed: false,
state: "canceled",
phase: "void",
__v: 9,
up_week: false,
client_id: "554bd0068fe",
delegation_accepted: false,
labels: [ARRAY OF OBJECTS],
was_delegated: false
}
答案 0 :(得分:0)
我最终做的是将模式建模为聚合管道的结果,并更改系统的各个部分以使用$ group中的关系。
相同数量的当前时间约为200-430毫秒。