コマンドラインでの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を[]で括る。
- ラジバンダリ。

い、以上です。。
音声ファイルを文字に変換します。
Googleマップのストリートビューを使って、日本中どこへでもあなたをいざないます。
うちの売電実績を毎月記録しています。