MongoDB对象上的$ setUnion($ setUnion,但有附加信息)

时间:2019-01-17 11:41:24

标签: mongodb mongodb-query aggregation-framework

stackoverflow社区, 我不经常在mongodb中使用大型对象数组 所以我不知道如何解决这个问题:

1。 我正在处理一个文件,因此很明显,这是一个aggregate女巫,首先要做一个{$match:{"_id" : ObjectId("5c3f5cb04147b3082648278b") }},

2。 好的,现在我又执行了一个步骤,即$ project + $ filter来过滤掉某些对象,但这并不重要(我认为)

  1. 我有一个对象数组,类似于此

    { “ _id”:ObjectId(“ ..”), “数据”:  [

    {
      id : 01,
      groupId: 22,
      noteId: 876543
    },
    {
      id : 02,
      groupId: 33,
      noteId: 767676
    },
    {
      id : 03,
      groupId: 22,
      noteId: 876543
    },
    {
      id : 04,
      groupId: 76,
      noteId: 876543
    }
    

    ] }

,但是有成千上万的条目,每个对象有更多的值。

每个groupId可以具有任何noteId,但是相同的组始终具有相同的noteId。 问题:noteId可以在组之间共享。

我添加了这个

{ $project: {
                "groupIds": {"$setUnion": "$data.groupId"}
            }}

witch给了我所有的groupId 但同时获得所有相关的noteId也很重要,因为 它是一个任意的ID,与其他无关。

是否可以通过指定的字段以某种方式合并对象? 还是有另一种方法来解决这个问题?如果我可以用$ in($ data.groupId,$ setUnion('from from above')过滤对象,我仍然不知道如何仅提取我需要的2个字段。

感谢您的提前帮助

H.M。

1 个答案:

答案 0 :(得分:1)

您可以使用以下汇总

db.collection.aggregate([
  { "$unwind": "$data" },
  { "$group": {
    "_id": {
      "_id": "$_id",
      "groupId": "$data.groupId"
    },
    "noteIds": {
      "$push": {
        "noteId": "$data.noteId",
      }
    }
  }},
  { "$group": {
    "_id": "$_id._id",
    "data": {
      "$push": {
        "groupId": "$_id.groupId",
        "noteIds": "$noteIds"
      }
    }
  }}
])