如何解决MongoDB 聚合具有单独日期范围的子字段
我有一个架构:
{
"_id" : "12345678","action1" : [
{
"date" : "2021-01-15","value" : 20
},{
"date" : "2021-01-14","value" : 16
}
],"action2" : [
{
"date" : "2021-01-15","value" : 30
},"value" : 10
}
],"action3" : [
{
"date" : "2021-01-15","value" : 40
},"value" : 20
}
],"action4" : [
{
"date" : "2021-01-15","value" : 60
},"value" : 40
}
]
}
现在我想编写一个聚合查询来过滤掉某个日期范围内的计数(过去 7 天、30 天或 90 天)
所以最终的总和应该如下所示:
{
_id: "12345678"
action1 : {
alltime: number,last7Days : number,last30Days: number,last90Days: number
},action2: {
alltime: number,action3: {
alltime: number,action4: {
alltime: number,}
我正在尝试使用 $project
和 $match
获取特定 _id
的操作总数
但是如何过滤过去7天/30天/90天的数据
我的查询如下所示
db.collection.aggregate([
{
$project: {
alltimeAction1: {$sum: "$action1.value"},alltimeAction2: {$sum: "$action2.value"},alltimeAction3: {$sum: "$action3.value"},alltimeAction4: {$sum: "$action4.value"}
}
},{
$match: {
_id: "12345678"
}
}
])
mapReduce
是唯一可用的选项吗?
解决方法
db.test1.aggregate([
{
"$project": {//Reshape actions,you need this as you have dynamic keys
data: {
"$objectToArray": "$$ROOT"
}
}
},{//Denormalize
"$unwind": "$data"
},{//Denormalize
"$unwind": "$data.v"
},{
"$project": {//Formatting date
"_id": 1,"key": "$data.k","date": {
"$dateFromString": {
"dateString": "$data.v.date","format":"%Y-%m-%d"
}
},"value": "$data.v.value"
}
},{
"$addFields": {//Getting the conditions ready
"7Days": {
$gte:["$date",new Date(new Date().getTime() - (7*24*3600*1000))]
},"30Days": {
$gte:["$date",new Date(new Date().getTime() - (30*24*3600*1000))]
}
}
},{
$group:{//Grouping them,you can add few more cases
"_id": "$key","7days":{
$sum:"$value"
},"30days":{
$sum:"$value"
}
}
}
])
如果您有扁平化架构,其中 actionName 可以由常量字段名称标识,则您不需要执行如此复杂的查询。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。