我需要获取给定时间范围内集合中条目的每日,每周和每月平均值。 这是我到目前为止使用的查询。
db.collection.aggregate([
{
$match: {
"date":{
$gte:ISODate('2017-01-01T00:00:00.000Z'),
$lte:ISODate('2017-12-31T23:59:59.000Z')
}
}
},
{
$project : {
"_id":0,
"day": { $dayOfYear: "$date" }, //returns number between 1 and 366
"week": { $week: "$date" }, //number between 0 and 53
"month": { $month: "$date" } //number between 1 and 12
}
},
{
$group : {
"_id":"$month", //change this to $day or $week when needed
"total":{$sum : 1}
}
},
{
$group : {
"_id":null,
"total":{$avg : "$total"}
}
}
])
然后我得到这样的东西:
{
"_id" : null,
"total" : 4793758.66666666667
}
它可以工作,但是我需要将第一个$ group _id更改为$ day或$ week才能获得结果。因此,为了生成单个报告,我实际上运行了三次查询。
是否可以在单个查询中获取每日,每周和每月的平均值?
答案 0 :(得分:2)
使用$facet
。在$facet
之后添加下面的$match
阶段,而不是其他阶段。
类似
{
"$facet":{
"day":[
{"$group":{"_id":{"$dayOfYear":"$date"},"total":{"$sum":1}}}
],
"week":[
{"$group":{"_id":{"$week":"$date"},"total":{"$sum":1}}}
],
"month":[
{"$group":{"_id":{"$month":"$date"},"total":{"$sum":1}}}
]
}
},
{
"$project":{
"totalDay":{"$avg":"$day.total"},
"totalWeek":{"$avg":"$week.total"},
"totalMonth":{"$avg":"$month.total"}
}
}