首页 > 解决方案 > 对象上的 MongoDB $setUnion ($setUnion 但带有附加信息)

问题描述

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

1. 我在一个文件中工作,所以显然这是一个aggregate女巫首先做了一个{$match:{"_id" : ObjectId("5c3f5cb04147b3082648278b") }},

2. 好的,现在我有另一个步骤 $project + $filter 来过滤掉一些对象,但这并不重要(我认为)

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

    { "_id": ObjectId(".."), "data": [

    {
      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。问题:noteIds 可以在组之间共享。

我添加了这个

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

女巫给了我所有的 groupId,但我也得到了所有相关的 noteId,这一点非常重要,因为它是一个与其他任何东西无关的任意 ID。

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

提前感谢您的帮助

HM

标签: mongodbmongodb-queryaggregation-framework

解决方案


您可以使用以下聚合

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"
      }
    }
  }}
])

推荐阅读