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
},
...

以上两个应该合并为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 回答