这就是我的收藏结构的样子:
{
"_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数据库。
感谢。
答案 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表示日期,可能与本地时区不同。解决方案包括: