Как объединить результаты двух запросов?
Пример данных в бд:
Коллекция COMMON
{
"_id": ObjectId("idCommon_1"),
"idDirectory": ObjectId("idDirectory_1")
},
{
"_id": ObjectId("idCommon_2"),
"idDirectory": ObjectId("idDirectory_2")
},
Коллекция DIRECTORY
{
"_id": ObjectId("idDirectory_1"),
"documents":[
{
"_id": ObjectId("idDocument_1"),
"comment": "Комментарий_1"
},
{
"_id": ObjectId("idDocument_2"),
"comment": "Комментарий_2"
}
]
},
{
"_id": ObjectId("idDirectory_2"),
"documents":[
{
"_id": ObjectId("idDocument_3"),
"comment": "Комментарий_3"
}
]
}
Коллекция DOCUMENT
{
"_id": ObjectId("idDocument_1"),
"number": "num_1"
},
{
"_id": ObjectId("idDocument_2"),
"number": "num_2"
},
{
"_id": ObjectId("idDocument_3"),
"number": "num_3"
}
Нужно сделать запрос в COMMON и получить ожидаемый результат:
[
{
"id": "idCommon_1",
"documentsResponse": [
{
"id": "idDocument_1",
"number": "num_1",
"comment": "Комментарий_1"
},
{
"id": "idDocument_2",
"number": "num_2",
"comment": "Комментарий_2"
}
]
},
{
"id": "idCommon_2",
"documentsResponse": [
{
"id": "idDocument_3",
"number": "num_3",
"comment": "Комментарий_3"
}
]
}
]
Сейчас делаю запрос, состоящий из двух lookup
:
Aggregation aggregation = newAggregation(
lookup1("DIRECTORY", "idDirectory", "_id", "directory"),
lookup2("DOCUMENT", "directory.idDocument", "_id", "documentsResponse")
);
mongoTemplate.aggregate(aggregation, "COMMON", Object.class);
Но тогда получается два разных массива: directory
(в котором хранятся необходимые мне directory.comment
) и documentsResponse
(где хранятся documentsResponse.number
). Не понимаю как это объединить с учетом idDocument
.
А если меняю lookup2
на
lookup2("DOCUMENT", "directory.idDocument", "_id", "directory.document")
то directory.comment
затираются.
Ответы (1 шт):
Автор решения: Alexander Petrov
→ Ссылка
db.DIRECTORY.aggregate([
{
"$project": { "a": "$documents" }
},
{
"$lookup": {
"from": "DOCUMENT",
"localField": "a._id",
"foreignField": "_id",
"as": "b"
}
},
{
"$project": {
"x": {
"$map": {
"input": "$a",
"as": "c",
"in": {
"$mergeObjects": [
"$$c",
{ "$arrayElemAt": [ "$b", 0 ] }
]
}
}
}
}
},
{
"$lookup": {
"from": "COMMON",
"localField": "_id",
"foreignField": "idDirectory",
"as": "d"
}
},
{ "$unwind": "$d" },
{
"$project": {
"_id": "$d._id",
"documentsResponse": "$x"
}
}
])