1

ここは初めて - 気軽にどうぞ… ;)

私は初めて MongoDB を使い始めました。公式の PHP ドライバーを使用してアプリケーションと対話します。集計フレームワークに関して私が遭遇した最初の問題は次のとおりです。次の短縮された例のように、すべてに数値の配列が含まれているドキュメントのコレクションがあります...

{
  "_id": ObjectId("51c42c1218ef9de420000002"),
  "my_id": 1,
  "numbers": [
    482,
    49,
    382,
    290,
    31,
    126,
    997,
    20,
    145
  ],

}

{
  "_id": ObjectId("51c42c1218ef9de420000006"),
  "my_id": 2,
  "numbers": [
    19,
    234,
    28,
    962,
    24,
    12,
    8,
    643,
    145
  ],

}

{
  "_id": ObjectId("51c42c1218ef9de420000008"),
  "my_id": 3,
  "numbers": [
    912,
    18,
    456,
    34,
    284,
    556,
    95,
    125,
    579
  ],

}

{
  "_id": ObjectId("51c42c1218ef9de420000012"),
  "my_id": 4,
  "numbers": [
    12,
    97,
    227,
    872,
    103,
    78,
    16,
    377,
    20
  ],

}

{
  "_id": ObjectId("51c42c1218ef9de420000016"),
  "my_id": 5,
  "numbers": [
    212,
    237,
    103,
    93,
    55,
    183,
    193,
    17,
    346
  ],

}

集計フレームワークと PHP (これが正しい方法だと思います) を使用して、数値がコレクション (数値配列内) に表示されない平均回数を計算しようとしています。たとえば、上の例で数値 20 が表示されない平均回数は 1.5 です (2 つのコレクションのギャップがあり、その後に 1 のギャップが続きます。これらの値を合計し、ギャップの数で割ります)。数値 20 が結果配列内にあるかどうかを調べてから、$cond 演算子を使用して、結果に基づく値を渡します。これが私のPHPです…</p>

$unwind_results = array(
    '$unwind' => '$numbers'
);

$project = array (
    '$project' => array(
        'my_id' => '$my_id',
        'numbers' => '$numbers',
        'hit' => array('$cond' => array(
            array(
                '$eq' => array('$numbers',20)
                 ),
            0,
            1
            )
        )
    )
);

$group = array (
    '$group' => array(
        '_id' => '$my_id',
        'hit' => array('$min'=>'$hit'),
    )
);

$sort = array(
    '$sort' => array( '_id' => 1 ),
);


$avg = $c->aggregate(array($unwind_results,$project, $group,  $sort));

私が達成しようとしていたのは、数 20 が数値配列に現れるたびにリセットする何らかのインクリメンタル カウンターをセットアップし、それらの数値をすべて取得してそこから平均を計算することでした…しかし、私は本当に困惑しています。

アプリケーション側でドキュメントのコレクションから平均を計算できることはわかっていますが、理想的には、Mongo で必要な結果が得られるようにして、移植性を高めたいと考えています。

Map/Reduce はどこかに関与する必要がありますか?

ヘルプ/アドバイス/ポインターは大歓迎です!

4

1 に答える 1