Использование MongoDB 4.2 и MongoDB Atlas для тестирования конвейеров агрегации.
У меня есть коллекция products , содержащая документы с этой схемой:
{
"name": "TestProduct",
"relatedList": [
{id:ObjectId("someId")},
{id:ObjectId("anotherId")}
]
}
Тогда есть эта коллекция городов , содержащая документы с этой схемой:
{
"name": "TestCity",
"instructionList": [
{ related_id: ObjectId("anotherId"), foo: bar},
{ related_id: ObjectId("someId"), foo: bar}
{ related_id: ObjectId("notUsefulId"), foo: bar}
...
]
}
Моя цель - объединить обе коллекции, чтобы вывести что-то вроде этого (операция - выбор каждого связанного объекта из инструкции в городской документ, чтобы поместить его в relatedList документа продукта):
{
"name": "TestProduct",
"relatedList": [
{ related_id: ObjectId("someId"), foo: bar},
{ related_id: ObjectId("anotherId"), foo: bar},
]
}
Я пытался использовать оператор поиска $ для агрегирования, например this :
$lookup:{
from: 'cities',
let: {rId:'$relatedList._id'},
pipeline: [
{
$match: {
$expr: {
$eq: ["$instructionList.related_id", "$$rId"]
}
}
},
]
}
Но это не работает, я немного потерян с этим сложным конвейерным синтаксисом.
Редактировать
Используя размотку на обоих массивах:
{
{$unwind: "$relatedList"},
{$lookup:{
from: "cities",
let: { "rId": "$relatedList.id" },
pipeline: [
{$unwind:"$instructionList"},
{$match:{$expr:{$eq:["$instructionList.related_id","$$rId"]}}},
],
as:"instructionList",
}},
{$group: {
_id: "$_id",
instructionList: {$addToSet:"$instructionList"}
}}
}
Я могу однако, чтобы достичь того, чего я хочу, я не получаю чистого результата:
{
"name": "TestProduct",
instructionList: [
[
{
"name": "TestCity",
"instructionList": {
"related_id":ObjectId("someId")
}
}
],
[
{
"name": "TestCity",
"instructionList": {
"related_id":ObjectId("anotherId")
}
}
]
]
}
Как я могу сгруппировать все так, чтобы оно было таким же чистым, как указано для моего исходного вопроса? Опять же, я полностью потерялся в структуре агрегации.