【问题标题】:Refine/Restructure data from Mongodb query从 Mongodb 查询中优化/重组数据
【发布时间】:2014-11-04 16:30:52
【问题描述】:

我正在使用 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"
  ]
}

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    一种方法是先,

    $unwind 基于staff 字段的文档,这样做是为了 选择预期的staff。这一步是必需的,因为 aggregation 中的 $elemMatch 运算符不可用 框架。

    这里有一张开票:Jira

    一旦选择了具有正确staff 的文档,$unwind,基于$services$group,一起$pushing 所有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}}
    ])
    

    【讨论】:

    • 谢谢!我认为这应该是可能的。但是聚合似乎比我的客户端细化要复杂一些......所以我认为我会坚持下去:)
    猜你喜欢
    • 2015-01-21
    • 2015-01-09
    • 2015-03-06
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多