如果该值退出,我正在尝试计算总值。但查询不能100%正常工作。那么有人可以帮助我解决这个问题。这是我的示例文档。我附上了两份文件。请这些文件&找出最佳解决方案 文件:1
{
"_id" : 1"),
"message_count" : 4,
"messages" : {
"data" : [
{
"id" : "11",
"saleValue": 1000
},
{
"id" : "112",
"saleValue": 1400
},
{
"id" : "22",
},
{
"id" : "234",
"saleValue": 111
}
],
},
"createdTime" : ISODate("2018-03-18T10:18:48.000Z")
}
文件:2
{
"_id" : 444,
"message_count" : 4,
"messages" : {
"data" : [
{
"id" : "444",
"saleValue" : 2060
},
{
"id" : "444",
},
{
"id" : 234,
"saleValue" : 260
},
{
"id" : "34534",
}
]
},
"createdTime" : ISODate("2018-03-18T03:11:50.000Z")
}
需要输出:
{
total : 4831
}
我的查询:
db.getCollection('myCollection').aggregate([
{
"$group": {
"_id": "$Id",
"totalValue": {
$sum: {
$sum: "$messages.data.saleValue"
}
}
}
}
])
所以请尽可能帮我解决这个问题。提前致谢
答案 0 :(得分:1)
它无法正常工作,因为它正在汇总集合中的所有文档;您正在对常量"_id": "tempId"
进行分组,只需将$
添加为:{/ p>即可引用正确的密钥
db.getCollection('myCollection').aggregate([
{ "$group": {
"_id": "$tempId",
"totalValue": {
"$sum": { "$sum": "$messages.data.value" }
}
} }
])
本质上是聚合操作的单阶段管道版本,带有一个额外字段,用于在组管道之前保存sum表达式,然后将该字段作为组中的$sum
运算符调用。
自MongoDB 3.2+ $sum
以来的上述工作在 $project
和 $group
阶段均可使用在 $project
阶段,$sum
返回表达式列表的总和。表达式"$messages.data.value"
返回一个数字[120, 1200]
列表,然后将其用作$sum
表达式:
db.getCollection('myCollection').aggregate([
{ "$project": {
"values": { "$sum": "$messages.data.value" },
"tempId": 1,
} },
{ "$group": {
"_id": "$tempId",
"totalValue": { "$sum": "$values" }
} }
])
答案 1 :(得分:1)
db.getCollection('myCollection').aggregate([
{
$unwind: "$messages.data",
$group: {
"_id": "tempId",
"totalValue": { $sum: "$messages.data.value" }
}
}
])
答案 2 :(得分:0)
您可以在$unwind
之前添加$group
,这样您就可以解构数据数组,然后就可以正确分组:
db.myCollection.aggregate([
{
"$unwind": "$messages.data"
},
{
"$group": {
"_id": "tempId",
"totalValue": {
$sum: {
$sum: "$messages.data.value"
}
}
}
}
])
输出:
{ "_id" : "tempId", "totalValue" : 1320 }
答案 3 :(得分:0)
根据上述问题的描述,作为解决方案,请尝试执行以下聚合查询
db.myCollection.aggregate(
// Pipeline
[
// Stage 1
{
$unwind: {
path: '$messages.data'
}
},
// Stage 2
{
$group: {
_id: {
pageId: '$pageId'
},
total: {
$sum: '$messages.data.saleValue'
}
}
},
// Stage 3
{
$project: {
pageId: '$_id.pageId',
total: 1,
_id: 0
}
}
]
);