MongoDB - 在地图中使用地图聚合

MongoDB - aggregation using map within map

是否可以在对象数组中映射一个数组?

我目前有这个 addFields 管道阶段,有问题的代码是 $setUnion 聚合器的第二个数组元素。它目前 returns 我需要的值所在的数组,所以我最终得到一个 'users' 由数组组成的数组(来自第二个映射阶段),然后是其他项目的字符串值在 setUnion 数组代码中,但我只需要嵌套数组中的所有字符串值。

当前添加字段后的文档示例输出:

{   
    _id: '6291f69f811b414175d11b16',
    savesOnComment: [],
    comments: [{
            _id: '6297aa1112c9fe003a32ddeb',
            owner: '61152b692816b44ff246e07b',
            contentId: '6291f69f811b414175d11b16',
            replyId: null,
            saves: ['61152b692816b44ff246e07b']
        }, {
            _id: '6297aa1512c9fe003a32dded',
            owner: '61152b692816b44ff246e07b',
            contentId: '6291f69f811b414175d11b16',
            replyId: null,
            saves: ['61152b692816b44ff246e07b']
        }],
    users: [
        ['61152b692816b44ff246e07b'],
        '61152b692816b44ff246e07b',
        ]
                
}

addFields 管道阶段:

{
      'users': {
        '$setUnion': [{
          '$map': {
            'input': '$comments',
            'as': 'each',
            'in': '$$each.owner'
          }
        }, {
          '$map': {
            'input': '$comments',
            'as': 'each',
            'in': {
              '$map': {
                'input': '$$each.saves',
                'as': 'save',
                'in': '$$save'
              }
            }
          }
        }, 
        '$savesOnComment']
      }
    }

有很多方法可以做到这一点。这是使用 "$reduce"“提取”"comments.saves" 内容的一种方法,本质上是将其展平,以便 "$setUnion" 提供您想要的输出。

db.collection.aggregate([
  {
    "$set": {
      "users": {
        "$setUnion": [
          "$savesOnComment",
          "$comments.owner",
          {
            "$reduce": {
              "input": "$comments.saves",
              "initialValue": [],
              "in": {
                "$concatArrays": [ "$$value", "$$this" ]
              }
            }
          }
        ]
      }
    }
  }
])

mongoplayground.net 上试用。