1

我有一个MongoDB聚合PHP定义为:

$results = $c->aggregate(array(
    array(
      '$project' => array(
          'year' => array('$year' => array('$add' => array('$executed.getTime()', 3600))),
          'month' => array('$month' => array('$add' => array('$executed.getTime()', 3600))),
          'day' => array('$dayOfMonth' => array('$add' => array('$executed.getTime()', 3600)))
      ),
    ),
    array(
      '$group' => array(
          '_id' => array('year' => '$year', 'month' => '$month', 'day' => '$day'),
          'count' => array('$sum' => 1)
      ),
    ),
    array(
      '$sort' => array(
          '_id' => 1
      ),
    ),
    array(
      '$limit' => 30
    )
));

问题是$add聚合函数$project不起作用。

 exception: the $year operator does not accept an object as an operand

在日期/时间字段中添加任意秒数的正确方法是什么$executed

谢谢。

4

1 回答 1

0

您看到的问题是 MongoDB 中的一个错误,我在SERVER-9289中报告了该错误。解决此问题的方法是将日期运算符的参数包装在一个数组中,如以下 shell 示例所示:

> db.foo.drop()

> db.foo.insert({x:ISODate()})

> db.foo.aggregate({$project: {x:1, y: {$year: {$add:['$x',1000]}}}})
Error: Printing Stack Trace
    at printStackTrace (src/mongo/shell/utils.js:37:7)
    at DBCollection.aggregate (src/mongo/shell/collection.js:897:1)
    at (shell):1:8
Mon Apr  8 18:15:15.198 JavaScript execution failed: aggregate failed: {
    "errmsg" : "exception: the $year operator does not accept an object as an operand",
    "code" : 16021,
    "ok" : 0
} at src/mongo/shell/collection.js:L898

> db.foo.aggregate({$project: {x:1, y: {$year: [{$add:['$x',1000]}]}}})
{
    "result" : [
        {
            "_id" : ObjectId("516341333512acfb2d33f156"),
            "x" : ISODate("2013-04-08T22:14:11.665Z"),
            "y" : 2013
        }
    ],
    "ok" : 1
}

将它移植到 PHP 应该是微不足道的。

话虽如此,您的原始代码确实在对$executed. 根据$project文档,您可以按名称(或指向对象/数组中的字段的虚线路径)引用 BSON 文档中的字段,但不支持在这些字段上调用 ​​JavaScript 方法。沿着这些思路,聚合管道在原始 BSON 文档上运行,因此这些类型在管道过程中永远不会转换为它们的 JavaScript 表示形式(例如,BSON 日期永远不会成为 ISODate)。

值得庆幸的是,$executed.getTime()MongoDB 2.4 甚至不需要调用。SERVER-6239改进了对 BSON 日期处理$add$subtract. 您可以查看该票证以了解更多详细信息,例如减去两个日期或添加日期和数字的预期结果。

于 2013-04-08T22:31:44.330 回答