MongoDB聚合及;在3个集合之间查找

MongoDB聚合及;在3个集合之间查找,mongodb,nosql,Mongodb,Nosql,我试图创建一个简单的客户/产品/订单数据库。 我更喜欢使用ref键,而不是仅仅为了练习而嵌入的文档。 我想做的是按客户名称分组,然后对每个客户的订单总数=总和(产品价格x数量) 这是我尝试过的查询,但不起作用:/ db.customers.aggregate([ {$lookup:{from:"orders", localField:"ordered",foreignField:"_id", as:"Bought"}}, {$lookup:{from:"products", loc

我试图创建一个简单的客户/产品/订单数据库。

我更喜欢使用ref键,而不是仅仅为了练习而嵌入的文档。 我想做的是按客户名称分组,然后对每个客户的订单总数=总和(产品价格x数量)

这是我尝试过的查询,但不起作用:/

db.customers.aggregate([
  {$lookup:{from:"orders", localField:"ordered",foreignField:"_id", as:"Bought"}},
  {$lookup:{from:"products", localField:"Bought.Includes.product",foreignField:"_id", as:"User_products"}},
  {$group:{_id:{name:"$name"},total: { $multiply: [ "$price", "$quantity" ] }}},
  {$project: {name:1, total:1}  }
]).pretty()


你差一点就搞定了,只是一些问题。代码注释中的解释

[
{
$lookup:{
来自:“订单”,
localField:“已订购”,
foreignField:“\u id”,
as:“已购买”
}
},
{
$unwind:“$BUNDED”//如果要使用子文档数组中的字段进一步使用“$lookup”,则必须在数组中使用$unwind
},
{
$unwind:'$BUNDED.Includes'//此处还有$unwind
},
{
$lookup:{
来自:“产品”,
localField:“购买的.包含的.产品”,
foreignField:“\u id”,
as:“用户和产品”
}
},
{
$unwind:'$User\U products'//也在此处$unwind
},
{
$group:{
_id:“$name”,//[可选]只有一个字段用作键,无需在对象中换行
总数:{
$sum:{//别忘了在这里加$sum
$乘法:[
“$User\u products.Price”,//使用完整对象路径访问值
“$Buyed.Includes.quantity”//访问完整对象的值
]
} 
}
}
},
]
更多关于


提示:请确保使用大小写时保持一致,我注意到您使用的是
product
vs
Price
vs
Quantity
这将更容易拼写错误

您为订单和产品发布了相同的图像没有问题,欢迎使用堆栈溢出。另一个提示:请避免发布数据的图像,而是将数据作为文本发布在问题内容中。您可以使用编辑器格式化功能使其更具可读性。关于如何问“是”,请咨询这里的指南,我总是忘记上/下呵呵。由于某种原因,我现在出现了这个错误,忘记了$unwind另一个阶段,我已经修改了答案,包括fixThank buddy,works!我有一个问题:我来自SQL,是mongoDB的新手——我创建集合的方式正确吗?像我那样使用ref键是正确的还是有更好的方法?因为像你刚才所做的那样“加入”可能会很糟糕,我想知道是否有更好的方法来创建集合以更好地查询NoSQL世界。设计模式的方法主要有多种。通常情况下,这取决于数据的访问模式,即查询方式。您可以从以下指南开始:1。2.