gpt4 book ai didi

Mongodb同时在多个字段上聚合(计数)

转载 作者:IT老高 更新时间:2023-10-28 13:10:09 30 4
gpt4 key购买 nike

我有如下文件:

{
"_id" : "someuniqueeventid",
"event" : "event_type_1",
"date" : ISODate("2014-01-14T00:00:00Z"),
}

我想按“event”分组并计算一周中每一天发生的每种事件类型的数量。基本上,我想得到类似的东西:

{
"_id": "event_type_1",
"1": "number of event_type_1 for Monday",
"2": "number of event_type_1 for Tuesday",
...
},
{
"_id": "event_type_2",
...
}

不幸的是,我被困在:

db.data.aggregate([ {$project: {date_of_week: {$dayOfWeek: "$date"}, event: "$event"}}, 
{$group: {_id: "$event", .... } ])

有什么想法吗?

最佳答案

聚合框架不会基于数据创建键,不应该你甚至应该这样做,因为“数据”不是键而是数据,所以你应该坚持这个模式。

这意味着您基本上可以这样做:

db.data.aggregate([
{ "$group": {
"_id": {
"event_type": "$event",
"day": { "$dayOfWeek": "$date" }
},
"count": { "$sum": 1 }
}}
])

这将计算每个事件在一周中每一天的发生次数,尽管输出中的多个文档,但这很容易更改为每个事件的单个文档:

db.data.aggregate([
{ "$group": {
"_id": {
"event_type": "$event",
"day": { "$dayOfWeek": "$date" }
},
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": "$_id.event_type",
"days": { "$push": { "day": "$_id.day", "count": "$count" } }
}}
])

这是一个数组形式,但它仍然包含你想要的结果。

如果你真的一心想要做你的确切形式,那么你想做这样的事情:

db.data.aggregate([
{ "$group": {
"_id": "$event",
"1": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 1 ] },
1,
0
]
}
},
"2": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 2 ] },
1,
0
]
}
},
"3": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 3 ] },
1,
0
]
}
},
"4": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 4 ] },
1,
0
]
}
},
"5": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 5 ] },
1,
0
]
}
},
"6": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 6 ] },
1,
0
]
}
},
"7": {
"$sum": {
"$cond": [
{ "$eq": [{ "$dayOfWeek": "$date" }, 7 ] },
1,
0
]
}
}
}}
)

但这真的很冗长,所以恕我直言,我会坚持第一个或第二个解决方案,因为它们更短且更易于阅读。

关于Mongodb同时在多个字段上聚合(计数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25843255/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com