コマンドラインでの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.まとめ
- PHPでソースを書くときは、コマンドラインのaggregateの内容をpipelineにそのまま記載するイメージ。
- cursorは必須。
- pipelineを[]で括る。
- ラジバンダリ。
い、以上です。。