【问题标题】:Sum Embedded Document Fields in Mongo Aggregate Query在 Mongo 聚合查询中求和嵌入文档字段
【发布时间】:2017-06-23 12:07:56
【问题描述】:

数据如下:

{
    "_id":5345345345,
    "city": "Detroit",
    "people":[
        {
            "name":"Larry",
            "value":1200
        },
        {
            "name":"Steve",
            "value":1100
        },
        {
            "name":"Larry",
            "value":1000
        },
        {
            "name":"Joe",
            "value":800
        },
        {
            "name":"Larry",
            "value":500
        },
        {
            "name":"Joe",
            "value":700
        }

    ]
}

我在一个聚合查询的中间有这个。我可以从这里做些什么来总结价值字段并为“人”中的每个人提供唯一的条目?即

{
    "_id":5345345345,
    "city": "Detroit",
    "people":[
        {
            "name":"Larry",
            "value":2700
        },
        {
            "name":"Steve",
            "value":1100
        },
        {
            "name":"Joe",
            "value":1500
        }
    ]
}

此外,如果“人”数组为空,则不能有返回空文档的查询,例如,不能这样做:

{$unwind:{
    path:people
    }
},
{$group :
    {
        _id:"$people.name",
        total_value:{"$sum":"people.value"}
    }
}

如果在 people 数组为空时它没有返回空文档,那将可以正常工作。

需要以某种方式使用 $addToSet 和 $sum 吗?如何保持值与名称相关联?

【问题讨论】:

  • 你颠覆了我的认知。
  • @Jack:当 people 数组为空时,为什么不能返回一个空文档?您在那里的查询看起来正确(这正是我自己推荐的),所以也许您的应用程序的代码需要能够处理空文档情况?
  • @VinceBowdren 感谢您的输入可能最终会这样做
  • @Jack 不确定这是否是您需要的。您可以在使用$unwind 之前使用$match 阶段过滤空的人员数组文档。类似{$match:{"people":{$ne:[]}}}

标签: mongodb sum aggregation-framework


【解决方案1】:

使用

 {
        $unwind: {
            path : "$people",
            preserveNullAndEmptyArrays : true // this line!
        }
 }

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    相关资源
    最近更新 更多