【问题标题】:mongoDB PHP aggregate collection by date and sum field per datemongoDB PHP按日期聚合集合和每个日期的总和字段
【发布时间】:2017-07-02 15:19:15
【问题描述】:

我正在尝试输出一个按日期分组的日期数组,其中包含一个名为 minutes_numeric 的字段的总和。

我目前的查询是:

return $this->db->Work->aggregate(array(
            array(
                '$match' => array(
                    'date' => array('$gt' => $start, '$lt' => $end)
                )
            ),
            array(
                '$project' => array(
                    'year' => array('$year' => '$date' ),
                    'month' => array('$month' => '$date' ),
                    'day' => array('$dayOfMonth' => '$date'),
                ),
            ),
            array(
                '$group' => array(
                    '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
                    'minutes_numeric' => array('$sum' => 1)
                ),
            ),
            array(
                '$sort' => array(
                    '_id' => 1
                ),
            ),
            array(
                '$limit' => 30
            )
        ));

哪些输出:

{
result: [
{
_id: {
year: 2013,
month: 12,
day: 4
},
minutes_numeric: 40
},
{
_id: {
year: 2013,
month: 12,
day: 11
},
minutes_numeric: 127
},
{
_id: {
year: 2013,
month: 12,
day: 12
},
minutes_numeric: 108
}
],
ok: 1
}

这很好,但是minutes_numeric 代表当天的行数,所以我更改了$group 子句:

    array(
        '$group' => array(
            '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
            'minutes_numeric' => array('$sum' => '$minutes_numeric')
        ),
    ),

然后将总和 (minutes_numeric) 更改为 0,而不是实际总和。

我不确定为什么我的总和出错了,非常感谢任何帮助


编辑,

如果我更新 $project 以包含 minutes_numeric 那么总和似乎不包括 $match 参数

 array(
            '$project' => array(
                'year' => array('$year' => '$date' ),
                'month' => array('$month' => '$date' ),
                'day' => array('$dayOfMonth' => '$date'),
                'minutes_numeric' => 1
            ),
        ),
        array(
            '$group' => array(
                '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
                'minutes_numeric' => array('$sum' => '$minutes_numeric')
            ),
        )

【问题讨论】:

  • 对不起,我不明白“总和似乎排除了 $match 参数”,这是什么意思?
  • 您可以与我们分享您进行编辑后的结果吗?
  • 请提供您收藏中的实际文件。我怀疑“minutes_numeric”不是一个简单的顶级字段。

标签: php mongodb aggregation-framework


【解决方案1】:

如果这是您当前的查询

return $this->db->Work->aggregate(array(
            array(
                '$match' => array(
                    'date' => array('$gt' => $start, '$lt' => $end)
                )
            ),
            array(
                '$project' => array(
                    'year' => array('$year' => '$date' ),
                    'month' => array('$month' => '$date' ),
                    'day' => array('$dayOfMonth' => '$date'),
                    'minutes_numeric' => 1
                ),
            ),
            array(
                '$group' => array(
                    '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
                    'minutes_numeric' => array('$sum' => '$minutes_numeric')
                ),
            ),
            array(
                '$sort' => array(
                    '_id' => 1
                ),
            ),
            array(
                '$limit' => 30
            )
        ));

那么您的 $match 参数被“忽略”并且结果与您期望的不一样的唯一方法可能是因为它们是错误的。尝试检查 $start 和 $end 的值,因为您使用的查询似乎是正确的。

如果这不是问题,请使用当前查询的结果更新您的问题。 (如果它与我的答案不同,也请更新您的查询)

【讨论】:

  • 实际上,日期范围应该是 $gte 而不是 $gt。但我怀疑真正的问题是 minutes_numeric 不是顶级字段。
  • 您的意思是您正在尝试在查询中即时计算 minutes_numeric,但它实际上并不存在于集合的字段中,对吧?如果是这样,请说明您打算如何计算它。
  • 在聚合管道的 $group 对象中,您可以即时计算/创建一个新字段,因此我认为该字段是否存在于集合的文档中没有问题.此外,$gt vs $gte 可能不是 $match 参数被“排除”的原因(无论这可能意味着什么)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 2021-03-08
  • 2018-04-25
  • 2013-11-25
  • 2018-08-16
相关资源
最近更新 更多