2014-10-17 221 views
0

我無法理解MongoDB的聚合框架。基本上我的JSON是這樣的:Mongo聚合和n個字段計數

[ 
    { 
    "id": 1, 
    "param1": true, 
    "param2": false, 
    "param3": false 
    }, 
    { 
    "id": 2, 
    "param1": true, 
    "param2": false, 
    "param3": true 
    }, 
    { 
    "id": 3, 
    "param1": false, 
    "param2": true, 
    "param3": false 
    } 
] 

我想看看有多少文件有,例如,參數1 ==真,參數2 ==真等。 在這種情況下,預期的結果應該是:

count_param1: 2 
count_param2: 1 
count_param3: 1 

這裏的竅門是PARAM可以是參數1 .. paramN,所以基本上我要麼需要做一個獨特的和確切指定哪些字段IM感興趣的還是可以的我以「參數」開頭的所有字段上的「組」。

推薦的方法是什麼?


進一步解釋:

的SQL相當於是做:

SELECT COUNT(param1) AS param1 
FROM [Table] 
GROUP BY param1 

對於每一列(但在一個查詢)。

回答

0

這已經解決了。 查看我的相關question和chridam的優秀答案。

我的需求的完美解決方案。

0

我不會用聚集,因爲有這個一個內置的輔助count()

> db.collection.count({ "param1" : true }) 

您可以創建一個簡單的函數,它的參數名作爲參數,還給計數:

> param_count = function(param_name) { 
    count_obj = {} 
    count_obj[param_name] = true 
    return db.collection.count(count_obj) 
} 

雖然在技術上是可能得到的計數在一個聚合管道全部參數,可以是不可行的100萬個+行,這將是更好地做到每PARAM NAME一個聚合管道。我並不熟悉SQL,但是我猜測,當你給出SQL的等價物並且說你會在「一個查詢」中完成它們時,你意味着你會發送一批SQL,但它本質上是一個串聯對不同的查詢進行分組和統計,因此與我提供的解決方案沒有多大區別。

如果存在計數,則可以使用paramN上的索引。

+0

試過了。一個沒有索引的param_count在300000個文檔中花費了0.2秒。太慢了。 – Norrin 2014-10-17 18:56:42