В моей коллекции есть следующая схема:
{
_id: ObjectId,
foo: [
{
bar_id: ObjectId,
bar_list: [
{...},
{...},
]
},
{
bar_id: ObjectId,
bar_list: [
{...},
{...},
]
}
...
]
],
relations: {
relation_type: [
{
relation_id: ObjectId,
...
}
]
...
}
}
I wi sh, чтобы создать новый документ с аналогичной структурой (relations
не требуется в новом документе), так как входные документы, но это агрегирование по relation_id
и где массивы bar_list
каждого входного документа объединены (включая дубликаты).
Для иллюстрации:
Документ 1
{
_id: 1,
foo: [
{
bar_id: 77,
bar_list: [
{a, b},
{c, d},
]
},
{
bar_id: 88,
bar_list: [
{u, v},
{w, x},
{y, z},
]
}
]
],
relations: {
relation_type: [
{
relation_id: 666,
...
}
]
...
}
}
Документ 2
{
_id: 2,
foo: [
{
bar_id: 77,
bar_list: [
{a, b},
{e, f},
{g, h},
]
},
{
bar_id: 88,
bar_list: [
{u, v},
]
}
]
],
relations: {
relation_type: [
{
relation_id: 666,
...
}
]
...
}
}
Выходной документ
{
foo: [
{
bar_id: 77,
bar_list: [
{a, b},
{c, d},
{a, b},
{e, f},
{g, h},
]
},
{
bar_id: 88,
bar_list: [
{u, v},
{w, x},
{y, z},
{u, v},
]
}
]
],
}
Первая часть фильтрации совпадений с relations.relation_type.relation_id
проста. Но как мне объединить массив на основе bar_id
и отформатировать результат, как требуется? Вот что у меня есть:
db.getCollection('example').aggregate([
{'$match': {'relations.relation_type.relation_id': 666}},
// Some sore of $group, $mergeObjects or $concatArrays next?
])
Любая помощь приветствуется.