Mongodb聚合组按天(php)

时间:2014-03-06 14:06:02

标签: php mongodb

我有一个包含以下文档的集合:

{
    _id: ObjectId("516eb5d2ef4501a804000000"),
    accountCreated: "2013-04-17 16:46",
    accountLevel: 0,
    responderCount: 0
}

我想根据accountCreated日期(每天的计数)对这些文档进行分组和计数,但由于日期也包括时间,因此我一直处理日期。 这就是我所拥有的,但它会返回包含时间的计数,这意味着很多条目总是以1作为帐户。

$g = $form->mCollectionUsers->aggregate(array(
    array( '$group' => array( '_id' => '$accountCreated', 'accounts' => array( '$sum' => 1 ) ) )
));

有没有办法将日期重写为仅占用帐户中的一天并跳过时间?

我找到了this example,但我无法弄清楚如何使其适应这个例子。

2 个答案:

答案 0 :(得分:3)

如果accountCreated是一个日期,你可以这样做(我将使用mongo shell语法,因为我不熟悉php驱动程序):

db.mCollectionUsers.aggregate([
    {$project :{
        day : {"$dayOfMonth" : "$accountCreated"},
        month : {"$month" : "$accountCreated"},
        year : {"$year" : "$accountCreated"}
    }},
    {$group: {
        _id : {year : "$year", month : "$month", day : "$day"},
        accounts : { "$sum" : 1}
    }}
]);

答案 1 :(得分:0)

如果要正确显示日期:

db.mCollectionUsers.aggregate([
    {
        $group: {
            _id: { $dateToString: { format: '%Y-%m-%d', date: '$accountCreated' } },
            count: { $sum: 1 }
        }
    },
    {
        $project: {
            _id: 0,
            date: '$_id',
            count: 1
        }
    }
])

结果如下:

[
  {
    "date": "2020-11-11",
    "count": 8
  },
  {
    "date": "2020-11-13",
    "count": 3
  },
  {
    "date": "2020-11-16",
    "count": 3
  },
]