Как создать объединение встроенных массивов в агрегате mongodb - PullRequest
1 голос
/ 09 июля 2020

У меня есть набор документов в форме:

{
    skill_id: 2,
    skill_recs: [
        {
            _id: 4,
            member_ids: [1, 4, 5]
        }
    ]
},
{
    skill_id: 5,
    skill_recs: [
        {
            _id: 4,
            member_ids: [1, 7, 9]
        }
    ]
}

Теперь я хочу объединить набор этих документов так, чтобы skill_recs объединялись с помощью _id, а member_ids всех объединенных документов объединялись в единое объединение значений ...

{ _id: 4,
  member_ids: [1, 4, 5, 7, 9]
}

Я получаю большую часть пути с:

db.aggregate([
    {
        $unwind: '$skill_recs'
    },
    {
        $group: {
            _id: '$skill_recs._id',
            all_member_ids: {$push: '$skill_recs.member_ids'}
        }
    },
    {
        $addFields: {
            member_ids: {$setUnion: '$all_member_ids'}
        }
    }
])

, но $setUnion не объединяет массив массивов, который он передается.

Вместо этого он производит:

{ _id: 4,
  member_ids: [[1, 4, 5], [1, 7, 9]]
}

Каким-либо способом произвести объединение этих массивов?

1 Ответ

1 голос
/ 09 июля 2020

Вы очень близки. Вот быстрый пример того, как этого добиться с помощью $ reduce

db.collection.aggregate([
  {
    $unwind: "$skill_recs"
  },
  {
    $group: {
      _id: "$skill_recs._id",
      all_member_ids: {
        $push: "$skill_recs.member_ids"
      }
    }
  },
  {
    $addFields: {
      member_ids: {
        $reduce: {
          input: "$all_member_ids",
          initialValue: [],
          in: {
            $setUnion: [
              "$$this",
              "$$value"
            ]
          }
        }
      }
    }
  }
])

Mon go Playground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...