我收集了以下文件:
{
"_id" : ObjectId("54acfb67a81bf9509246ed81"),
"Billno" : 1234,
"details" : [
{
"itemcode" : 12,
"itemname" : "Paste100g",
"qty" : 2,
"price" : 50
},
{
"itemcode" : 14,
"itemname" : "Paste30g",
"qty" : 4,
"price" : 70
},
{
"itemcode" : 12,
"itemname" : "Paste100g",
"qty" : 4,
"price" : 100
}
]
}
{
"_id" : ObjectId("54acff86a81bf9509246ed82"),
"Billno" : 1237,
"details" : [
{
"itemcode" : 12,
"itemname" : "Paste100g",
"qty" : 3,
"price" : 75
},
{
"itemcode" : 19,
"itemname" : "dates100g",
"qty" : 4,
"price" : 170
},
{
"itemcode" : 22,
"itemname" : "dates200g",
"qty" : 2,
"price" : 160
}
]
}
我需要在输出下方显示。请帮忙
必需输出:
---------------------------------------------------------------------------------
itemcode itemname totalprice totalqty
---------------------------------------------------------------------------------
12 Paste100g 225 9
14 Paste30g 70 4
19 dates100g 170 4
22 dates200g 160 2
答案 0 :(得分:2)
MongoDB aggregation pipeline可用于解决您的问题。您可以使用$unwind
从$group
到" sum"总数:
db.collection.aggregate([
// Unwind the array to de-normalize as documents
{ "$unwind": "$details" },
// Group on the key you want and provide other values
{ "$group": {
"_id": "$details.itemcode",
"itemname": { "$first": "$details.itemname" },
"totalprice": { "$sum": "$details.price" },
"totalqty": { "$sum": "$details.qty" }
}}
])
理想情况下,您希望其中的$match
阶段首先过滤掉任何不相关的数据。这基本上是MongoDB查询,并采用所有相同的参数和运算符。
这里的大多数都很简单。 $unwind
有点像" JOIN"在SQL中,除了在嵌入式结构中," join"已经制作好了,所以你只是“正常化”#34;就像一个加入会在"一对多"之间进行表关系,但只是在文档本身。它基本上是"重复" "父母"将每个数组成员的数组部分记录为新文档。
然后$group
工作的一个键,如" GROUP BY",其中"键"是_id
值。那里的一切都是" distinct"所有其他值都由"分组运算符"。
这就是像$first
这样的操作进来的地方。如手册页所述,这需要"首先"来自"分组边界的值"在" key"中提到早。你想要这个,因为这个字段的所有值都是"可能"是相同的,所以这是一个合理的选择,只需选择"首先"匹配。
最后,有$sum
分组运算符可以完成预期的操作。所有提供的值都在"键"是"添加"或者"总结"共同提供一个。就像SQL SUM()
。
另请注意,所有$
前缀名称都是聚合框架如何处理" field / property"的变量。正在处理的当前文档中的名称。 "Dot notation"用于引用嵌入的"字段/属性"嵌套在父属性名称中。
学习MongoDB中的聚合很有用。通常会查询除了基本" SELECT"之外的任何内容。语句是SQL。不只是为了"分组"但也适用于其他操纵。
阅读所有aggregation operators的文档,如果您对SQL有一定的了解,请在文档中查看SQL to Aggregation Mapping作为一般指南。它有助于解释概念并展示可以完成的一些事情。