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

表示されている問題は、 SERVER-9289で報告した MongoDB のバグです。これを回避するには、次のシェルの例のように、日付演算子の引数を配列でラップする必要があります。

> 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$addおよびでの BSON 日付処理のサポートが改善されました$subtract。2 つの日付を減算したり、日付と数値を加算した場合の予想される結果など、詳細については、そのチケットを参照してください。

于 2013-04-08T22:31:44.330 に答える