从Mongodb查询中优化/重构数据

时间:2014-11-04 16:30:52

标签: mongodb mongodb-query

我正在使用NodeJs,MongoDB Native 2.0 +

以下查询获取包含嵌入式人员和服务数组的一个客户端文档。

db.collection('clients').findOne({_id: sessId}, {"services._id": 1, "staff": {$elemMatch: {_id: reqId}}}, callback)

返回这样的结果:

{
  _id: "5422c33675d96d581e09e4ca",
  staff:[
    {
      name: "Anders"
      _id: "5458d0aa69d6f72418969428"
      // More fields not relevant to the question...
    }
  ],
  services: [
    {
      _id: "54578da02b1c54e40fc3d7c6"
    },
    {
      _id: "54578da42b1c54e40fc3d7c7"
    },
    {
      _id: "54578da92b1c54e40fc3d7c9"
    }
  ]
}

请注意,services中的每个嵌入对象实际上都包含多个字段,但_id是通过查询投影返回的唯一字段。

从这个返回的数据开始,我从services“拔出”所有id并将它们保存在稍后用于验证的数组中。这绝不是一个困难的操作......但我很好奇...有没有一种简单的方法来进行某种聚合而不是find,直接从数据库获取已经被拔除的objectId的数组。像这样:

{
  _id: "5422c33675d96d581e09e4ca",
  staff:[
    {
      name: "Anders"
      _id: "5458d0aa69d6f72418969428"
      // More fields not relevant to the question...
    }
  ],
  services: [
    "54578da02b1c54e40fc3d7c6",
    "54578da42b1c54e40fc3d7c7",
    "54578da92b1c54e40fc3d7c9"
  ]
}

1 个答案:

答案 0 :(得分:2)

这样做的一种方法是首先,

$unwind基于staff字段的文档,这是完成的 选择预期的staff。由于这个步骤是必需的 $elemMatchaggregation运算符不可用 框架。

这里有一张开放票:Jira

根据staff选择具有正确$unwind的文档$services后。 $group,一起$push将所有services _id放在一个数组中。

然后是$project运算符,以显示预期的字段。

db.clients.aggregate([
{$match:{"_id":sessId}},
{$unwind:"$staff"},
{$match:{"staff._id":reqId}},
{$unwind:"$services"},
{$group:{"_id":"$_id","services_id":{$push:"$services._id"},"staff":{$first:"$staff"}}},
{$project:{"services_id":1,"staff":1}}
])