按月对嵌入式数组进行分组和求和
Grouping and summing an embedded array by month
我有以下架构:
_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
}
如果您将字段保留在 BSON Date format, easily achievable by using group aggregation。
来自 Mongo 文档的非常相似的代码示例:
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 }
使用$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"}}
}}
])
我有以下架构:
_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
}
如果您将字段保留在 BSON Date format, easily achievable by using group aggregation。
来自 Mongo 文档的非常相似的代码示例:
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 }
使用$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"}}
}}
])