4

MongoDBMongoDB シェル経由で実行できる集計クエリがあります。PHPただし、公式のMongo ドライバー (http://php.net/manual/en/mongocollection.aggregate.php)で動作するように変換しようとしています。

以下は、未処理の MongoDB クエリです。

db.executions.aggregate( [  
   { $project : { day : { $dayOfYear : "$executed" } } },
   { $group : { _id : { day : "$day" }, n : { $sum : 1 } } } , 
   { $sort : { _id : -1 } } , 
   { $limit : 14 }
] )

Mongo ドライバーを使用する際の私の試み(動作していません)は次のとおりです。PHP

$result = $c->aggregate(array(
    '$project' => array(
        'day' => array('$dayOfYear' => '$executed')
    ),
    '$group' => array(
        '_id' => array('day' => '$day'),
        'n' => array('$sum' => 1)
    ),
    '$sort' => array(
        '_id' => 1
    ),
    '$limit' => 14
));

上記の PHP コードのエラーは次のとおりです。

{"errmsg":"exception: wrong type for field (pipeline) 3 != 4","code":13111,"ok":0}

何か案は?ありがとう。

4

2 に答える 2

18

Javascript のパラメーターは、それぞれ 1 つの要素を持つ 4 つのオブジェクトの配列です。PHP では、4 つの要素を持つ連想配列 (オブジェクト) です。これはあなたのJavascriptを表します:

$result = $c->aggregate(array(
    array(
      '$project' => array(
          'day' => array('$dayOfYear' => '$executed')
      ),
    ),
    array(
      '$group' => array(
          '_id' => array('day' => '$day'),
          'n' => array('$sum' => 1)
      ),
    ),
    array(
      '$sort' => array(
          '_id' => 1
      ),
    ),
    array(
      '$limit' => 14
    )
));

さらに、少なくとも PHP5.4 を使用している場合は、より単純な配列構文を使用できます。PHP への変換は簡単です。中括弧を角括弧に、コロンを矢印に置き換えるだけです。

$result = $c->aggregate([
  [ '$project' => [ 'day' => ['$dayOfYear' => '$executed']  ]  ],
  [ '$group' => ['_id' => ['day' => '$day'], 'n' => ['$sum' => 1]  ] ],
  [ '$sort' => ['_id' => 1] ],
  [ '$limit' => 14 ]
]);
于 2013-01-03T01:27:12.823 に答える