MongoDB中嵌套数组的$ reduce和$ setUnion

时间:2018-11-29 05:37:20

标签: mongodb mongodb-query aggregation-framework

我希望在MongoDB中使用$ reduce和$ setUnion合并嵌套数组。以下是示例输入-

levels: [
 [[80,100,120]],[[100,150]],[[200,80,100]],[[80,100]]
]

我想要得到的输出(即,将嵌套数组与唯一值合并)- 级别:[80,100,120,150,100]

我可以使用两种方法获得以上输出-

1)在管道中使用两个$ project阶段-

aggregate([
$project: { levels : { $reduce: {
input: "$levels", initialValue: [], in:{$setUnion:["$$value","$$this"]}}}},
$project: { levels : { $reduce: {
input: "$levels", initialValue: [], in:{$setUnion:["$$value","$$this"]}}}}
])

2)首先$ unwind,然后$ project

aggregate([
$unwind: { '$levels'}},
$project: { levels : { $reduce: {
input: "$levels", initialValue: [], in:{$setUnion:["$$value","$$this"]}}}}
])

在我不需要两次使用相同的$ project的情况下,有什么改进的首选方法?我正在努力避免放松。

1 个答案:

答案 0 :(得分:1)

您可以在单个$project阶段使用以下汇总

db.collection.aggregate([
  { "$project": {
    "levels": {
      "$reduce": {
        "input": {
          "$reduce": {
            "input": "$levels",
            "initialValue": [],
            "in": { "$setUnion": ["$$this", "$$value"] }
          }
        },
        "initialValue": [],
        "in": { "$setUnion": ["$$this", "$$value"] }
      }
    }
  }}
])