2013-01-25 152 views
0

我們已經設置了一個將事件寫入mongo實例的基本應用程序。以下是一個示例:Mongodb按列進行聚合/分組並計數特定列

"_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,但我不能爲我的生命數字出來......有什麼建議?

+2

應包含您在控制檯中嘗試的查詢。 – kmfk

回答

0

我不一定喜歡$or語句來完成這項工作,但此查詢應該爲你從PHP的工作,如果你使用的是1.3+蒙戈司機:

$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) 
} 
+0

謝謝!如果記錄集跨越200-400K記錄,您是否覺得這個解決方案會擴展? – user2009534

+0

我會建議評估索引的使用情況,以免不必要地進行完整的掃描。你應該沒問題,但你也可能想用upserts將這些數據預集合在一個單獨的集合中 - 這裏有mongo文檔中的例子。 – kmfk

相關問題