按月分组和汇总嵌入式阵列

时间:2018-09-09 20:52:58

标签: mongodb nosql mongodb-query aggregation-framework nosql-aggregation

我具有以下架构:

_id 
dates : 
    date :
       year
       month
       day
other unrelated fields

我已经对每个_id进行了分组,以便日期包含多个日期对象(包含年,月,日)。我现在想按年和月对每个日期对象进行分组,以便获得与年和月相对应的日期数的计数。例如,如果我有以下文档:

_id : 124567789554
dates : 
    date : 
        year : 2018
        month : 9
        day : 1
    date : 
        year : 2018
        month : 9
        day : 2
    date : 
        year : 2018
        month : 9
        day : 3
    date : 
        year : 2018
        month : 10
        day : 1

我想要的输出是:

_id : 124567789554
dates : 
    date : 
        year : 2018
        month : 9
        count : 3
    date : 
        year : 2018
        month : 10
        count : 1

我该怎么做?

编辑:对于某些其他情况,我首先必须按personId分组。最初,架构如下所示:

_Id (automatically generated by mongoDB)
personId 
date

有多个具有相同personId的行,对应于一个日期。我必须首先将_Id = personId分组,然后将日期汇总在一起。如何同时执行两项操作?我当前的查询:

{
  _id: "$personId",
  dates: {
    $addToSet: "$date"
  },
  other unrelated fields
}

2 个答案:

答案 0 :(得分:1)

使用$group按人员ID,月份和年份分组并计算匹配项的数量,然后使用$group收集年份和月份的所有日期并计算每个人员ID。

db.colname.aggregate([
  {"$group":{
    "_id":{"personId":"$personId","year":"$date.year","month":"$date.month"},
    "count":{"$sum":1}
  }},
  {"$group":{
    "_id":"$_id.personId",
    "dates":{"$push":{"year":"$_id.year","month":"$_id.month","count":"$count"}}
  }}
])

答案 1 :(得分:0)

如果您将字段保留为BSON Date格式,则可以使用group aggregation轻松实现。

Mongo Document中非常相似的代码示例:

db.sales.aggregate(
   [
      {
        $group : {
           _id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } },
           totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } },
           averageQuantity: { $avg: "$quantity" },
           count: { $sum: 1 }
        }
      }
   ]
)

结果:

{ "_id" : { "month" : 3, "day" : 15, "year" : 2014 }, "totalPrice" : 50, "averageQuantity" : 10, "count" : 1 }
{ "_id" : { "month" : 4, "day" : 4, "year" : 2014 }, "totalPrice" : 200, "averageQuantity" : 15, "count" : 2 }
{ "_id" : { "month" : 3, "day" : 1, "year" : 2014 }, "totalPrice" : 40, "averageQuantity" : 1.5, "count" : 2 }