MongoCollection::group

(PECL mongo >=0.9.2)

MongoCollection::groupSQL の GROUP BY コマンドと似た処理を行う

説明

public MongoCollection::group ( mixed $keys , array $initial , MongoCode $reduce [, array $options = array() ] ) : array

パラメータ

keys

group by したいフィールド。 配列あるいは非コードオブジェクトが渡された場合は、 結果をグループ化するキーとして扱います。

1.0.4+: keysMongoCode のインスタンスである場合は、 keys はグループ化のキーを返す関数であると見なします (下の例 "keys へ関数を渡す" を参照ください)。

initial

集約カウンタオブジェクトの初期値。

reduce

ふたつの引数 (現在のドキュメント、 そして集約する点) を受け取って集約をする関数。

options

group コマンドへのオプションのパラメータ。次のオプションが使えます。

  • "condition"

    集約処理に含めるドキュメントの条件。

  • "finalize"

    一意なキーごとに一度だけコールされる関数。 reduce 関数の最後の出力を受け取ります。

  • "maxTimeMS"

    サーバー上で操作を行う累積時間の制限 (アイドル時間を含まない) を、ミリ秒単位で指定します。この時間内にサーバー側の操作が完了しなければ、MongoExecutionTimeoutException をスローします。

返り値

結果を含む配列を返します。

変更履歴

バージョン 説明
1.5.0 "maxTimeMS" オプションが追加されました。
1.2.11 optionsscalar のときに 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++; }'));

?>