在 MongoDB 中使用 $lookup
Using $lookup in MongoDB
我在 mydb 数据库中有以下集合:
purchases:它包含以下格式的文档:
{
_id: <ObjectId>,
name: <String>, //customer name
purchasedItems: <Array>
0: < Object >
i_name: <String> // item name
qntity: <Int>
// other objects in the array
}
sales:它包含以下格式的文档:
{
_id: <ObjectId>,
i_name: <String>,
qntity: <Int>
cost: <Int>
}
我想输出一个包含以下文档的新集合:
{
_id: <ObjectId>,
name: <String>,
cost: <Int>
}
其中 name 是采购集合中 customer 的名称,cost 是他购买的所有件商品的费用。
形式上,每件商品的成本定义为:
purchases.purchasedItems.qntity/sales.qntity) * sales.cost
哪里 purchases.purchasedItems.i_name=sales.i_name
输出集合中的和cost是所有项目成本的总和。
我已经尝试了以下但它不起作用:
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"}
])
对于我做错了什么以及正确的做法,我将不胜感激。
所以这里有几处不正确。
$lookup
阶段后缺少参考和 $unwind
的一堆。
尝试
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"}
])
我在 mydb 数据库中有以下集合:
purchases:它包含以下格式的文档:
{ _id: <ObjectId>, name: <String>, //customer name purchasedItems: <Array> 0: < Object > i_name: <String> // item name qntity: <Int> // other objects in the array }
sales:它包含以下格式的文档:
{ _id: <ObjectId>, i_name: <String>, qntity: <Int> cost: <Int> }
我想输出一个包含以下文档的新集合:
{
_id: <ObjectId>,
name: <String>,
cost: <Int>
}
其中 name 是采购集合中 customer 的名称,cost 是他购买的所有件商品的费用。
形式上,每件商品的成本定义为:
purchases.purchasedItems.qntity/sales.qntity) * sales.cost
哪里 purchases.purchasedItems.i_name=sales.i_name
输出集合中的和cost是所有项目成本的总和。
我已经尝试了以下但它不起作用:
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"}
])
对于我做错了什么以及正确的做法,我将不胜感激。
所以这里有几处不正确。
$lookup
阶段后缺少参考和 $unwind
的一堆。
尝试
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"}
])