0

イベントをmongoインスタンスに書き込む基本的なアプリケーションをセットアップしました。書き込み例は次のとおりです。

"_id" : ObjectId("50fee761472870a3d610956e"),
    "user_id" : "pa-XXXXXXXXX",
    "event_id" : 1,
    "date_created" : 1337798856,
    "url" : "http://news.yahoo.com/australian-tycoon-worlds-richest-woman-103810206.html"

やりたいことは、URL と特定の event_id の数でグループ化された結果を取得することです。同様に、event_grouping_a は event_ids 1、6、35 で構成され、event_grouping_b は 2、66、103 で構成されます。サンプル出力は次のようになります。

{
    url: "http://news.yahoo.com/australian-tycoon-worlds-richest-woman-103810206.html",
    event_grouping_a: 46,
    event_grouping_b: 34
},
{
    url: "http://news.yahoo.com/another-cool-story",
    event_grouping_a: 105,
    event_grouping_b: 59
}

このタイプの集計/グループ化を実行する方法について何か考えはありますか? 最終的な目標は PHP でそれを実現することですが、mongod コンソールでそれを行うのは無駄でした。URL でグループ化することはできますが、単一の親 URL の下に両方のイベント タイプを表示することはできません。次のようなものを吐き出します。

{
    url: "http://news.yahoo.com/australian-tycoon-worlds-richest-woman-103810206.html",
    event_grouping_a: 46
    event_grouping_b: 0
},
{
    url: "http://news.yahoo.com/australian-tycoon-worlds-richest-woman-103810206.html",
    event_grouping_a: 0
    event_grouping_b: 34
},
...

上記の2つは1つにマージする必要がありますが、私の人生ではそれを理解することはできません...何か提案はありますか?

4

1 に答える 1

0

これを機能させるためのステートメントが必ずしも好きではありません$orが、1.3+ mongo ドライバーを使用している場合、このクエリは php から機能するはずです。

$mongo = new MongoClient('dbinfo');
$collection = $mongo->selectCollection( 'dbName', 'collectionName' );

$pipeline = array(
    array( 
        '$group' => array(
            '_id' => '$url',
            'event_grouping_a' => array( 
                '$sum' => array( 
                    '$cond' => array( 
                        array( '$or' => array(
                            array( '$eq' => array( '$event_id', 1 ) ),
                            array( '$eq' => array( '$event_id', 6 ) ),
                            array( '$eq' => array( '$event_id', 35 ) )
                        ) ), 1, 0 ) 
                )   
            ),
            'event_grouping_b' => array(
                '$sum' => array(
                    '$cond' => array(
                        array( '$or' => array(
                            array( '$eq' => array( '$event_id', 2 ) ),
                            array( '$eq' => array( '$event_id', 66 ) ),
                            array( '$eq' => array( '$event_id', 103 ) )
                        ) ), 1, 0 )
                )
            )
        )
    )
);
$results = $collection->aggregate( $pipeline );

--

var_dump( $results );
array(2) { 
    ["result"]=> array(2) { 
        [0]=> array(3) { 
            ["_id"]=> string(40) "http://news.yahoo.com/another-cool-story" 
            ["event_grouping_a"]=> int(2) 
            ["event_grouping_b"]=> int(1) 
        } 
        [1]=> array(3) { 
            ["_id"]=> string(75) "http://news.yahoo.com/australian-tycoon-worlds-richest-woman-103810206.html" 
            ["event_grouping_a"]=> int(3) 
            ["event_grouping_b"]=> int(4) 
        } 
    } 
    ["ok"]=> float(1) 
}
于 2013-01-25T03:13:59.960 に答える