优化整个对象查询MongoDB的聚合

时间:2015-10-29 03:32:38

标签: mongodb query-optimization aggregation-framework

我有以下聚合管道需要大约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
  }

1 个答案:

答案 0 :(得分:0)

我最终做的是将模式建模为聚合管道的结果,并更改系统的各个部分以使用$ group中的关系。

相同数量的当前时间约为200-430毫秒。