繁体   English   中英

MongoDB 聚合管道:使用 For 循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM