每天分组和总结

时间:2016-06-09 14:50:06

标签: mongodb

这就是我的收藏结构的样子:

{
    "_id" : ObjectId("57589d2a9108dace306602b8"),
    "IDproject" : NumberLong(53),
    "email" : "john.doe@gmail.com",
    "dc" : ISODate("2016-06-06T22:33:13.000Z")
}

{
    "_id" : ObjectId("57589d2a9108dace306602b8"),
    "IDproject" : NumberLong(53),
    "email" : "david.doe@gmail.com",
    "dc" : ISODate("2016-06-07T22:33:13.000Z")
}

{
    "_id" : ObjectId("57589d2a9108dace306602b8"),
    "IDproject" : NumberLong(53),
    "email" : "elizabeth.doe@gmail.com",
    "dc" : ISODate("2016-06-078T22:33:13.000Z")
}

如您所见,6月7日增加了两个客户,6月6日增加了一个客户。我想对过去30天的结果进行分组和总结。

看起来应该是这样的:

{
  "dc" : "2016-06-05"
  "total" : 0
}

{
  "dc" : "2016-06-06"
  "total" : 1
}

{
  "dc" : "2016-06-07"
  "total" : 2
}

您可以看到,6月6日没有记录,所以它为零。它应该是6月5日零等等。

情况是#1,情况#2是以下结果:

  {
      "dc" : "2016-06-05"
      "total" : 0
   }


   {
      "dc" : "2016-06-06"
      "total" : 1
   }


  {
      "dc" : "2016-06-07"
      "total" : 3
   }

我试过这个:

db.getCollection('customer').aggregate([
{$match : { IDproject : 53}},    
{ $group: { _id: "$dc", total: { $sum: "$dc" } } }, ]);

但似乎很复杂。我第一次使用noSQL数据库。

感谢。

1 个答案:

答案 0 :(得分:0)

以下是您将获得每日计数的方法(行计数的常用习语为{$sum: 1})。

但是,您无法在缺少数据的日子获取零 - 因为没有数据可以为这些天提供分组键。您必须在PHP中处理这些情况,方法是生成一个desided日期列表,然后查看每个日期是否有数据。

db.getCollection('customer').aggregate([
    {$match : { IDproject : 53}},    
    {$group: { 
       _id: {year: {$year: "$dc"}, month: {$month: "$dc"}, day: {$dayOfMonth: "$dc"}}},
       total: {$sum: 1} 
    }}, 
]);

请注意,MongoDB仅在UTC时区运行;没有可以可靠地将时间戳转换为本地时区的聚合管道运算符。 $year$month$dayOfMonth运算符以UTC表示日期,可能与本地时区不同。解决方案包括:

  1. 在本地时区保存时间戳(=向MongoDB说明它们是UTC格式),
  2. 使用时间戳保存时区偏移
  3. 使用时间戳保存本地年,月和日的时间。