Использование $lookup в MongoDB
У меня есть следующие коллекции в базе данных mydb:
закупки: содержит документы в следующем формате:
{ _id: <ObjectId>, name: <String>, //customer name purchasedItems: <Array> 0: < Object > i_name: <String> // item name qntity: <Int> // other objects in the array }
продажа: содержит документы в следующем формате:
{ _id: <ObjectId>, i_name: <String>, qntity: <Int> cost: <Int> }
Я хотел бы вывести новую коллекцию, которая содержит следующие документы:
{
_id: <ObjectId>,
name: <String>,
cost: <Int>
}
Где имя - это имя клиента в коллекции покупок, а стоимость - это стоимость ВСЕХ предметов, которые он приобрел.
Формально стоимость каждого предмета определяется как:
покупки / покупка.квиты / продажи / продажа) * sales.cost
ГДЕ покупок.purchasedItems.i_name=sales.i_name
а стоимость в выходной коллекции - это сумма стоимости всех предметов.
Я пробовал следующее, но это не работает:
db.purchases.aggregate([
{$unwind: "$purchasedItems"},
{$lookup:
{from:"sales",
localField:"purchasedItems.i_name",
foreignField:"i_name",
as: "n_cost"}
},
{
$group:{
_id: "$_id",
name: "$name",
cost: {$sum: {multiply:[{$divide:["$n_cost.qntity","$qntity"]},"$n_cost.cost"]}}
}
},
{$out: "results"}
])
Буду признателен за любую помощь в том, что я сделал неправильно, и как это правильно сделать.
1 ответ
Так что здесь есть пара неверных вещей.
Куча пропавших без вести и пропавших без вести $unwind
после $lookup
этап.
Пытаться
db.purchases.aggregate([
{"$unwind":"$purchasedItems"},
{"$lookup":{
"from":"sales",
"localField":"purchasedItems.i_name",
"foreignField":"i_name","as":"n_cost"
}},
{"$unwind":"$n_cost"},
{"$group":{
"_id":"$_id",
"name":{"$first":"$name"},
"cost":{
"$sum":{
"$multiply":[
{"$divide":["$purchasedItems.qntity","$n_cost.qntity"]},
"$n_cost.cost"
]
}
}
}},
{"$out":"results"}
])
Без $unwind
db.purchases.aggregate([
{"$lookup":{
"from":"sales",
"localField":"purchasedItems.i_name",
"foreignField":"i_name",
"as":"n_cost"
}},
{"$project":{
"name":1,
"cost":{
"$sum":{
"$map":{
"input":{"$range":[0,{"$size":"$purchasedItems"}]},
"as":"ix",
"in":{
"$let":{
"vars":{
"purchase":{"$arrayElemAt":["$purchasedItems","$$ix"]},
"sales":{"$arrayElemAt":["$n_cost","$$ix"]}},
"in":{
"$multiply":[
{"$divide":["$$purchase.qntity","$$sales.qntity"]},"$$sales.cost"
]
}
}
}
}
}
}
}},
{"$out":"results"}
])