MongoCollection::group
(PECL mongo >=0.9.2)
MongoCollection::group — SQL の GROUP BY コマンドと似た処理を行う
説明
パラメータ
keys
group by したいフィールド。 配列あるいは非コードオブジェクトが渡された場合は、 結果をグループ化するキーとして扱います。
1.0.4+:
keys
が MongoCode のインスタンスである場合は、keys
はグループ化のキーを返す関数であると見なします (下の例 "keys
へ関数を渡す" を参照ください)。initial
集約カウンタオブジェクトの初期値。
reduce
ふたつの引数 (現在のドキュメント、 そして集約する点) を受け取って集約をする関数。
options
group コマンドへのオプションのパラメータ。次のオプションが使えます。
"condition"
集約処理に含めるドキュメントの条件。
"finalize"
一意なキーごとに一度だけコールされる関数。 reduce 関数の最後の出力を受け取ります。
"maxTimeMS"
サーバー上で操作を行う累積時間の制限 (アイドル時間を含まない) を、ミリ秒単位で指定します。この時間内にサーバー側の操作が完了しなければ、MongoExecutionTimeoutException をスローします。
返り値
結果を含む配列を返します。
変更履歴
バージョン | 説明 |
---|---|
PECL mongo 1.5.0 | "maxTimeMS" オプションが追加されました。
|
PECL mongo 1.2.11 | options が scalar のときに E_DEPRECATED を発行するようになりました。
|
例
例1 MongoCollection::group() の例
これは、ドキュメントをカテゴリー別にまとめて カテゴリーごとの名前の一覧を作ります。
<?php$collection->insert(array("category" => "fruit", "name" => "apple"));$collection->insert(array("category" => "fruit", "name" => "peach"));$collection->insert(array("category" => "fruit", "name" => "banana"));$collection->insert(array("category" => "veggie", "name" => "corn"));$collection->insert(array("category" => "veggie", "name" => "broccoli"));$keys = array("category" => 1);$initial = array("items" => array());$reduce = "function (obj, prev) { prev.items.push(obj.name); }";$g = $collection->group($keys, $initial, $reduce);echo json_encode($g['retval']);?>
上の例の出力は、 たとえば以下のようになります。
[{"category":"fruit","items":["apple","peach","banana"]},{"category":"veggie","items":["corn","broccoli"]}]
例2 MongoCollection::group() の例
この例ではキーを使わないので、すべてのドキュメントがそれ自身のグループに属します。 また、この例では条件を使います。 この条件にマッチするドキュメントのみがグループ関数による処理の対象となります。
<?php$collection->save(array("a" => 2));$collection->save(array("b" => 5));$collection->save(array("a" => 1));// すべてのフィールドを使用します$keys = array();// 初期値を設定します$initial = array("count" => 0);// 実行する JavaScript 関数$reduce = "function (obj, prev) { prev.count++; }";// "a" フィールドが 1 より大きいドキュメントのみを使用します$condition = array('condition' => array("a" => array( '$gt' => 1)));$g = $collection->group($keys, $initial, $reduce, $condition);var_dump($g);?>
上の例の出力は、 たとえば以下のようになります。
array(4) { ["retval"]=> array(1) { [0]=> array(1) { ["count"]=> float(1) } } ["count"]=> float(1) ["keys"]=> int(1) ["ok"]=> float(1) }
例3 keys
へ関数を渡す
フィールド名以外の何かでグループ化したい場合は、 MongoCollection::group() の最初のパラメータに関数を渡すと 各ドキュメントに対してそれを実行します。 関数の返り値を使ってグループ化することができます。
この例は、num フィールドを 4 で割ったあまりでグループ化する方法を示すものです。
<?php$c->group(new MongoCode('function(doc) { return {mod : doc.num % 4}; }'), array("count" => 0), new MongoCode('function(current, total) { total.count++; }'));?>