我在 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>
}
名称是购买集合中客户的名称,费用是所有的费用他购买的物品。
正式地,每个项目的成本定义为:
purchases.purchasedItems.qntity / sales.qntity)* sales.cost
在哪里购买.purchasedItems.i_name = sales.i_name
输出集合中的和成本是所有项目的总和&#39;成本。
我已经尝试了以下但是它不起作用:
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"}
])
我很欣赏任何帮助,说明我做错了什么,以及正确的做法是什么。
答案 0 :(得分: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"}
])