[英]mongodb - aggregation with $match $in with a $lookup pipeline
[英]MongoDB Aggregation pipeline: use of For loop
我想知道是否有人在 MongoDB 中有更好的查询方式。
我有一个集合,它存储用户 ID 的每小时信息。 此集合将为每个文档提供唯一的 user_id 和日期组合。 但是 user_id 可以有多个不同日期的整数。 示例文档条目如下所示
{ user_id : A,
date. : '2020-04-01'
hourly_info :
{ metric_one :
{ 0 : 4,
1: 7,
2:8
..
23: 43 }}}
我的问题是:对于给定的 user_id 和 daterange,按 user_id 分组,并计算每小时 metric_one 的总和。 样品 output 如下所示
{“_id”:“A”,“0”:45,“1”:28,“2”:31,....“23”:67}。
我的查询:
db.collection.aggregate([
{ '$match': {
'user_id':"A",
'date':{'$lte':ISODate('2020-04-01'),
'$gte':ISODate('2020-04-08') }
} },
{'$group':{
_id: '$user_id',
'0': { '$sum': '$hourly_info.metric_one.0'},
'1': { '$sum': '$hourly_info.metric_one.1'},
... ,
'23':{ '$sum': '$hourly_info.metric_one.23'}
}}
]).pretty()
如果有人能说除了从 0 到 23 的每一小时求和之外,是否还有更好的查询方法,我将不胜感激。
有没有更好的方法可以使用 for 循环,这样我就不必为 0 到 23 编写相同的求和逻辑?
像下面的东西
for (i = 0; i <= 23; i=i+1){
db.collection.aggregate([{
'$match': {
'user_id':"A",
'sales_date':{
'$lte':ISODate('2020-04-01'),
'$gte':ISODate('2020-04-08')
}
}
}, {
'$group': {
'_id': '$user_id',
{i}: {
'$sum': '$hourly_info.metric_one.{i}'
}
}
}
])
}
提前感谢您的帮助:)
这可以通过聚合来完成。 您可以使用 $objectToArray 并展开将每小时数据拆分为单独的文档,然后分组两次 - 一次用于每小时计数,一次用于为用户收集数据。 然后 $arrayToObject 再次使其成为 object 。
db.collection.aggregate([
{'$match': {
'user_id':"A",
'date':{'$gte':ISODate('2020-04-01'),
'$lte':ISODate('2020-04-08')}
}},
{'$addFields':{
'hourly_info.metric_one': {$objectToArray: '$hourly_info.metric_one'}
}},
{'$unwind':'$hourly_info.metric_one'},
{'$group':{
_id: {
'user':'$user_id',
'hour':'$hourly_info.metric_one.k'
},
'total': { '$sum': '$hourly_info.metric_one.v'}
}},
{'$group':{
'_id':'$_id.user',
'hourly':{'$push':{'k':'$_id.hour','v':'$total'}}
}},
{'$addFields': {'hourly':{'$arrayToObject':'$hourly'}}}
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.