MongoDB 聚合按天分组 (PHP)

3

我有一个文档集合,看起来像这样:

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

我想根据账户创建日期(每天计数)对这些文档进行分组和计数,但是由于日期包括时间,我无法处理日期。

这是我的代码,但它返回包括时间的计数,这意味着许多输入总是带有1个账户数量。

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

有没有一种方法可以只考虑日期而跳过时间来重写日期?

我找到了这个例子,但我真的搞不清如何将其适应于此示例。


2
你在这里最大的问题是你的日期是一个字符串。这阻止了你做任何有意义的事情。修复它们。 - Neil Lunn
@NeilLunn 感谢您的提示。有什么适当的替代建议吗?时间戳? - Henkealg
@Henkealg - 这取决于你的驱动程序。在shell中,您可以使用“ISODate(<string>)”方法。将当前日期时间字符串传递给它。 - Adil
真正的BSON日期。我希望你能有一个获取它们的来源。你正在使用PHP,所以驱动程序中有一个处理日期的类。在更新日期时,请确保使用它。 - Neil Lunn
你是在提到MongoDate()吧,我想。这对我来说是新的。我会重写这些记录的日期,以便使用@joao发布的答案。谢谢。 - Henkealg
2个回答

5
如果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}
    }}
]);

错误的。日期是一个字符串。尽管从技术上讲是正确的。 - Neil Lunn
确实,这就是我说“如果accountCreated是一个日期”的原因。无论如何,感谢您的纠正。 - joao

1
如果您想正确显示日期:
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
  },
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接