技術メモ

PHP7でMongoDBをaggregateする

コマンドラインでのMongoDBのクエリの投げ方はネットに色々載ってますが、PHPそれもPHP7からクエリを投げる方法があまり載ってなく、ハマってしまいましたのでつめあとを残したいと思います。
この記事ではPHP7でMongoDBにクエリを投げる一例を紹介します。

1.環境

項目 バージョン
PHP 7.1.23
MongoDB 4.0.3

↓こんなコレクションにクエリを投げます

_id name kingaku
ObjectId(“5c2ebd7dcf716baf62cfd03b”) taro 10
ObjectId(“5c2ebd8bcf716baf62cfd03c”) hanako 20
ObjectId(“5c2ebd95cf716baf62cfd03d”) taro 100
ObjectId(“5c2ebd9ccf716baf62cfd03e”) hanako 200

2.コマンドラインからクエリを投げる

コマンドラインでMongoDBをaggregateする方法は公式サイトやネットに載っています。

今回使うコレクションでの使用例は↓のような感じ。

db.コレクション名.aggregate([
  { $match : { name : "taro" } },
  { $group: { _id: "$name", kingaku_sum:{ $sum: "$kingaku"}}},
  { $sort: { "_id": 1 } }
])

nameが「taro」のドキュメントのkingakuをsumしてます。

結果:

{ "_id" : "taro", "kingaku_sum" : 110 }

 3.PHPからクエリを投げる

公式サイトに載ってる項目をつらつら書きます。

今回は「aggregate」、「cursor」、「pipeline」を設定します。

$aggregate = new \MongoDB\Driver\Command([
  'aggregate' => 'コレクション名',
  'cursor' => new stdClass,
  'pipeline' => [
    ['$match' => ['name' => 'taro']
    ],
    [ '$group' => ['_id' => '$name', 'kingaku_sum' => ['$sum' => '$kingaku'] ]
    ],
    [ '$sort' => ['_id' => 1]
    ]
  ],
]);

$cursor = $manager->executeCommand('DB名', $aggregate);

「pipeline」にコマンドラインのaggregateの内容(ステージ)を記載します。

cursorは設定しないとエラーになります。

PHP Fatal error: Uncaught MongoDB\\Driver\\Exception\\CommandException: The 'cursor' option is required, except for aggregate with the explain argument in ・・・

PHPの公式サイトでは「aggregate」と「pipeline」しか記載がありません。MongoDBのバージョン3.6以上では「cursor」を設定しないといけなくなったようです。

ここではPHPの標準クラス「stdClass」で結果を受けるようにしています。

あと、pipelineを[]で括らないとエラーになります。

あとは煮るなり焼くなりラジバンダリ。

foreach ($cursor as $document) {
  print_r($document->_id);
  print_r('<br>');
  print_r($document->kingaku_sum);
  print_r('<br>');
  print_r('<hr>');
}

 4.まとめ

  1. PHPでソースを書くときは、コマンドラインのaggregateの内容をpipelineにそのまま記載するイメージ。
  2. cursorは必須。
  3. pipelineを[]で括る。
  4. ラジバンダリ。


い、以上です。。