首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mongodb每两小时汇总一次

Mongodb每两小时汇总一次
EN

Stack Overflow用户
提问于 2016-08-03 04:24:30
回答 1查看 1.2K关注 0票数 3

我对以下表单有一个聚合查询

代码语言:javascript
运行
复制
db.mycollection.aggregate([  
  {
    "$match": 
    {
      "Time": { $gte: ISODate("2016-01-30T00:00:00.000+0000") }
    }
  },  
  { 
    "$group": 
    {
      "_id": 
      {  
        "day": { "$dayOfYear": "$Time" },  
        "hour": { "$hour": "$Time" } 
      },  
      "Dishes": { "$addToSet": "$Dish" }  
    }
  },  
  { 
    "$group": 
    {  
      "_id": "$_id.hour",  
      "Food": 
      {   
        "$push": 
        {  
          "Day": "$_id.day",  
          "NumberOfDishes": { "$size":"$Dishes" }  
        }  
      }  
    }
  },  
  {
    "$project":
      {
        "Hour": "$_id",
        "Food": "$Food",
        "_id" : 0
      }
  },  
  { 
    "$sort": { "Hour": 1 }
  }  
]);

我不想像上面那样在一个小时的持续时间里这样做,比如0-1,1-2,2-3,3-4,4-5,.,23-24,我想在两个小时的时间内做到这一点。例如0-2,2-4,4-6,.,22-24。有办法吗?

EN

回答 1

Stack Overflow用户

发布于 2016-08-03 07:23:22

提示:在$project中使用算术聚合算子

比方说,H=floor(hour/2),其中hour是从文档日期开始的实际时间。然后,您可以通过在此日期应用$floor$divide运算符来获得$floor

代码语言:javascript
运行
复制
"H": { $floor: { $divide: [ { "$hour": "$Time" }, 2 ] } }

这里H对应于对小时(Hours=[0,2) => H=0Hours=[2,4) => H=1Hours=[22,24) => H=11等)你可以把它传递到$group阶段

代码语言:javascript
运行
复制
$group: { "_id": { "day": { $dayOfYear: "$Time" }, "H": "$H" } }

然后,您可以为特定的H输出对小时。

代码语言:javascript
运行
复制
"Hours": [ { $multiply: [ "$H", 2 ] }, { $sum: [ { $multiply: [ "$H", 2 ] }, 2 ] } ]

给定的文件收集

代码语言:javascript
运行
复制
{ "Time" : ISODate("2016-01-30T01:00:00Z"), "Dish" : "dish1" }
{ "Time" : ISODate("2016-01-30T02:00:00Z"), "Dish" : "dish2" }
{ "Time" : ISODate("2016-01-30T03:00:00Z"), "Dish" : "dish3" }
{ "Time" : ISODate("2016-01-30T04:00:00Z"), "Dish" : "dish4" }
{ "Time" : ISODate("2016-01-30T05:00:00Z"), "Dish" : "dish5" }
{ "Time" : ISODate("2016-01-30T06:00:00Z"), "Dish" : "dish6" }
{ "Time" : ISODate("2016-01-30T07:00:00Z"), "Dish" : "dish7" }
{ "Time" : ISODate("2016-01-30T08:00:00Z"), "Dish" : "dish8" }
{ "Time" : ISODate("2016-01-30T09:00:00Z"), "Dish" : "dish9" }

并使用其上的下一个聚合

代码语言:javascript
运行
复制
db.mycollection.aggregate([  
  {
    "$match": 
    {
      "Time": { $gte: ISODate("2016-01-30T00:00:00.000+0000") }
    }
  },
  {
    "$project":
    {
      "Dish": 1,
      "Time": 1,
      "H": { $floor: { $divide: [ { $hour: "$Time" }, 2 ] } }
    }
  },
  { 
    "$group": 
    {
      "_id": 
      {  
        "day": { $dayOfYear: "$Time" },  
        "H": "$H" 
      },
      "Dishes": { $addToSet: "$Dish" }  
    }
  },  
  { 
    "$group": 
    {  
      "_id": "$_id.H",  
      "Food": 
      {   
        "$push": 
        {  
          "Day": "$_id.day",  
          "NumberOfDishes": { $size: "$Dishes" }  
        }  
      }  
    }
  },
  { 
    "$sort": { "_id": 1 }
  },
  {
    "$project":
      {
        "Hours": [ { $multiply: [ "$_id", 2 ] }, { $sum: [ { $multiply: [ "$_id", 2 ] }, 2 ] } ],
        "Food": "$Food",
        "_id": 0
      }
  }
]);

提供结果

代码语言:javascript
运行
复制
{ "Food" : [ { "Day" : 30, "NumberOfDishes" : 1 } ], "Hours" : [ 0, 2 ] }
{ "Food" : [ { "Day" : 30, "NumberOfDishes" : 2 } ], "Hours" : [ 2, 4 ] }
{ "Food" : [ { "Day" : 30, "NumberOfDishes" : 2 } ], "Hours" : [ 4, 6 ] }
{ "Food" : [ { "Day" : 30, "NumberOfDishes" : 2 } ], "Hours" : [ 6, 8 ] }
{ "Food" : [ { "Day" : 30, "NumberOfDishes" : 2 } ], "Hours" : [ 8, 10 ] }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38734389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档