$ lower и $ setUnion для вложенных массивов в MongoDB - PullRequest
0 голосов
/ 29 ноября 2018

Я хочу объединить вложенные массивы, используя $ lower и $ setUnion в MongoDB.Ниже приведен пример ввода -

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

CanЕсть ли какой-нибудь улучшенный способ первого варианта, когда мне не нужно использовать один и тот же проект $ дважды?Я пытаюсь избежать раскручивания.

1 Ответ

0 голосов
/ 29 ноября 2018

Вы можете использовать агрегацию ниже с одним $project stage

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