统计 mongodb 中的子文档字段和总金额
count the subdocument field and total amount in mongodb
我 collection 有以下文件:
{
"_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
MongoDB aggregation pipeline is available to solve your problem. You get details out of an array my processing with $unwind
and then using $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
有点像 SQL 中的 "JOIN" 除了在嵌入式结构中已经创建了 "join",所以你只是 "de-normalizing" 就像一个连接将在 "one to many" table 关系之间进行,但仅在文档本身内进行。它基本上 "repeats" "parent" 将每个数组成员的数组文档部分作为一个新文档。
然后 $group
键起作用,如 "GROUP BY",其中 "key" 是 _id
值。 "distinct" 所有其他值都由 "grouping operators".
收集
这就是 $first
之类的操作的用武之地。如手册页所述,这会从前面 "key" 中提到的 "grouping boundary" 中获取 "first" 值.您想要这个是因为该字段的所有值 "likely" 都相同,因此选择 "first" 匹配是合乎逻辑的选择。
最后是 $sum
分组运算符,它可以完成预期的工作。 "key" 下的所有提供值是 "added" 或 "summed" 一起提供总数。就像 SQL SUM()
.
另请注意,所有 $
前缀名称都是聚合框架如何处理当前正在处理的文档中 "field/property" 名称的变量。 "Dot notation" 用于引用嵌套在父 属性 名称中的嵌入式 "fields/properties"。
在MongoDB中学习聚合很有用。对于一般查询,基本 "SELECT" 语句之外的任何内容对于 SQL 都是什么。不仅用于 "grouping",还用于其他操作。
如果您对 SQL 有一定的了解,请阅读文档中所有 aggregation operators and also take a look a SQL to Aggregation Mapping 的文档作为一般指南。它有助于解释概念并展示一些可以完成的事情。
我 collection 有以下文件:
{
"_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
MongoDB aggregation pipeline is available to solve your problem. You get details out of an array my processing with $unwind
and then using $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
有点像 SQL 中的 "JOIN" 除了在嵌入式结构中已经创建了 "join",所以你只是 "de-normalizing" 就像一个连接将在 "one to many" table 关系之间进行,但仅在文档本身内进行。它基本上 "repeats" "parent" 将每个数组成员的数组文档部分作为一个新文档。
然后 $group
键起作用,如 "GROUP BY",其中 "key" 是 _id
值。 "distinct" 所有其他值都由 "grouping operators".
这就是 $first
之类的操作的用武之地。如手册页所述,这会从前面 "key" 中提到的 "grouping boundary" 中获取 "first" 值.您想要这个是因为该字段的所有值 "likely" 都相同,因此选择 "first" 匹配是合乎逻辑的选择。
最后是 $sum
分组运算符,它可以完成预期的工作。 "key" 下的所有提供值是 "added" 或 "summed" 一起提供总数。就像 SQL SUM()
.
另请注意,所有 $
前缀名称都是聚合框架如何处理当前正在处理的文档中 "field/property" 名称的变量。 "Dot notation" 用于引用嵌套在父 属性 名称中的嵌入式 "fields/properties"。
在MongoDB中学习聚合很有用。对于一般查询,基本 "SELECT" 语句之外的任何内容对于 SQL 都是什么。不仅用于 "grouping",还用于其他操作。
如果您对 SQL 有一定的了解,请阅读文档中所有 aggregation operators and also take a look a SQL to Aggregation Mapping 的文档作为一般指南。它有助于解释概念并展示一些可以完成的事情。