【问题标题】:MongoDB Aggregation PHP, Group by HoursMongoDB 聚合 PHP,按小时分组
【发布时间】:2013-01-02 10:08:01
【问题描述】:

我有以下格式的文件

{
  "_id" : ObjectId("12e123123123123123"),
  "client_id" : "12345667889",
  "resource" : "test/test",
  "version" : "v2",
  "ts" : new Date("Wed, 02 Jan 2013 15:34:58 GMT +08:00")
}

ts 是一个 MongoDate() 字段。

我正在尝试在 php 中使用 MongoDB 聚合函数按 client_id 和小时分组并计算使用情况以显示在表格/图表中

这是我目前的尝试

$usage = $this->db->Usage->aggregate(array(array(
  '$project' => array(
    'hour' => array(
      'years' => array( '$year' => '$ts' ),
      'months' => array( '$month' => '$ts' ),
      'days' => array( '$dayOfMonth' => '$ts' ),
      'hours' => array( '$hour' => '$ts' ),
    )
  ),
  '$group' => array(
    '_id' => array(
      'client_id' => '$client_id',
      'hour' => '$hour',
    ),
   'number' => array('$sum' => 1),
  )
)));

不幸的是,我得到的回复只是按 client_id 分组,没有别的。

[result] => Array
    (
        [0] => Array
            (
                [_id] => Array
                    (
                        [client_id] => adacf8deba7066e4
                    )

                [number] => 12
            )

    )

谁能指出我正确的方向,或者有另一种按小时分组的解决方案?

--固定-- PHP 要求您将每个管道放在一个单独的数组中,并将整个东西放在一个数组中。在 JohnnyHK 的帮助下查看下面的更新解决方案

$usage = $this->db->Usage->aggregate(array(array(
        '$project' => array(
            'client_id' => 1,
            'hour' => array(
                'years' => array( '$year' => '$ts' ),
                'months' => array( '$month' => '$ts' ),
                'days' => array( '$dayOfMonth' => '$ts' ),
                'hours' => array( '$hour' => '$ts' ),
            )
        )),array(
        '$group' => array(
            '_id' => array(
                'client_id' => '$client_id',
                'hour' => '$hour',
            ),
            'number' => array('$sum' => 1),
        )
    )));

【问题讨论】:

    标签: php mongodb mongodb-php


    【解决方案1】:

    它不应该创建您所看到的结果,但您确实需要在您的 $project 运算符中包含 client_id 以便它可供 $group 运算符使用。

    '$project' => array(
      'client_id' => 1,
      'hour' => array(
        'years' => array( '$year' => '$ts' ),
        'months' => array( '$month' => '$ts' ),
        'days' => array( '$dayOfMonth' => '$ts' ),
        'hours' => array( '$hour' => '$ts' ),
      )
    ),
    

    在我进行更改后,shell 等效项工作:

    db.test.aggregate(
        { $project: {
            hour: {
                years: {$year: '$ts'},
                months: {$month: '$ts'},
                days: {$dayOfMonth: '$ts'},
                hours: {$hour: '$ts'}
            },
            client_id: '$client_id'
        }},
        { $group: {
            _id: { client_id: '$client_id', hour: '$hour' },
            number: { $sum: 1}
        }})
    

    返回:

    {
      "result": [
        {
          "_id": {
            "client_id": "12345667889",
            "hour": {
              "years": 2013,
              "months": 1,
              "days": 2,
              "hours": 7
            }
          },
          "number": 1
        }
      ],
      "ok": 1
    }
    

    【讨论】:

    • 我得到了同样的回应。我在 shell 中尝试了同样的方法,却得到了同样的错误结果,这让我认为这与我的 Collection 设置方式或 Mongodb 本身有关。我正在运行 2.2.2 版。
    • 奇怪。我添加了我用来用 MongoDB v2.2.2 测试它的 shell 等效项。
    • 真棒修复了它。这是 php 传递变量所需的方式。不过,在项目中需要添加 client_id。我会用解决方案更新我的问题。
    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 2015-03-28
    • 2014-08-10
    • 2021-05-19
    • 2013-11-25
    • 2016-07-03
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多