gpt4 book ai didi

MongoDB 复杂聚合

转载 作者:可可西里 更新时间:2023-11-01 10:36:21 26 4
gpt4 key购买 nike

我的数据库中有以下结构的文档:

{
"reading_ts": ISODate(...),
"points": 2.3,
"user_id": 2
}

对于每个 user_id,我每天都会有更多这样的文档……数以百万计……我想实现以下聚合:

  1. 获取一个月的数据
  2. 将每个 user_id 的数据分组
  3. 对每天的数据进行分组(这样我就可以得到每个 user_id 每天的数据)
  4. 获取每个用户每天的最大“积分”
  5. 统计有多少用户的最高分低于 10,有多少在 10 到 20 之间,有多少超过 20

我可以用 $match 做第 1 步我可以使用这个来完成第 3 步:

{
"$group": {
"_id": {
"$subtract": [
"$reading_ts",
{
"$mod": [
{
"$toLong": "$reading_ts"
},
(1000 * 60 * 60 * 24)
]
}
]
}
}
}

问题是我现在不知道如何合并步骤 2 和 3。

最佳答案

您可以使用 $dayOfMonth$max 将步骤 2、3 和 4 组合在单个 $group 阶段中以获得最大值每个用户每天的“积分”。

然后,您可以使用边界设置为 [0, 10, 20] 的 $bucket 运算符按桶对用户进行计数:

db.collection.aggregate([
{
"$match": {
"reading_ts": {
"$gte": ISODate("2019-01-01"),
"$lte": ISODate("2019-01-30")
}
}
},
{
"$group": {
"_id": {
"user": "$user_id",
"day": {
"$dayOfMonth": "$reading_ts"
}
},
"max": {
"$max": "$points"
}
}
},
{
"$bucket": {
"groupBy": "$max",
"boundaries": [
0,
10,
20
],
"default": 20,
"output": {
"users": {
"$sum": 1
},

}
}
}
])

在线试用:mongoplayground.net/p/jzZdz2V7R4-

关于MongoDB 复杂聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56701548/

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