2016-05-12 59 views
0

我對MongoDB非常陌生,我想用Aggregation解決以下問題。我有這樣一個集合。MongoDB:從其值爲數組的字段計數值

{ 
"_id" : ObjectId("5732fa438acef72abc442ac8"), 
"publisherId" : NumberInt(1), 
"type" : NumberInt(3), 
"qualityInfo" : [ 
    "FilterOne", 
    "FilterTwo", 
    "FilterThree" 
], 
"date" : "2016-05-11 11:24:19" 
} 
{ 
    "_id" : ObjectId("5732fa438acef72abc442ac9"), 
    "publisherId" : NumberInt(3), 
    "type" : NumberInt(1), 
    "qualityInfo" : [ 
     "FilterOne", 
     "FilterFour" 
    ], 
    "date" : "2016-05-11 11:24:19" 
} 

我要統計每個值的occurrance在qualityInfo場並輸出結果類似於下面的東西。

{ 
"_id" : "FilterOne", 
"count" : "42" 
} 
{ 
    "_id" : "FilterTwo", 
    "count" : "30" 
} 
{ 
    "_id" : "FilterThree", 
    "count" : "12" 
} 
{ 
    "_id" : "FilterFour", 
    "count" : "43" 
} 

我寧願通過Aggregation實現這一目標,因爲我已經注意到,聚合操作比MapReduce快得多。如果我錯了,請糾正我的錯誤。所以有可能通過聚合來完成它?如果沒有,那麼我已經嘗試瞭如下的MapReduce查詢。

db.myCollection.mapReduce(
function(){ 
    for(i = 0; i < this.qualityInfo.length; i++ ){ 
     emit(this.qualityInfo[i], null); 
    } 
}, 
function(names, vals){ 
    return Array.sum(names); 
}, 
{ query: { publisherId: 2 }, out: "qualityResult" } 

);

但這並沒有給我一個計數值。只需在MapReduce結果中返回_idvalue中的名稱字符串即可。

回答

1

使用mongodb聚合它是一個簡單的命令行。

db.collection.aggregate([ 
    { $unwind:"$qualityInfo"}, 
    { $project: {"qualityInfo":1} }, 
    { $group:{ 
      _id:"$qualityInfo", 
      count: {$sum:1}}´ 
    } 
]); 
+0

此查詢給我一個空的結果。根本不值一提。 –

+0

好的,我得到了問題。 '$ project'應該放在'$ unwind'之前。我在查詢中也有一個'$匹配',我在開始時就提出了這個問題。所以它工作。謝謝! –

+0

很高興它正在工作。在我看來,$投影不應該引起任何問題,因爲它只是進入下一個階段的一個選項,我想你有$匹配的東西在這裏是不可見的,哪些是導致問題的原因。 – AMITAVA

1

你幾乎在那裏通過使用地圖縮小。 使用以下的map-reduce功能:

db.myCollection.mapReduce(
function(){ 
    for(i = 0; i < this.qualityInfo.length; i++ ){ 
     emit(this.qualityInfo[i], 1); 
    } 
}, 
function(names, vals){ 
    return Array.sum(vals); 
}, 
{ query: { publisherId: 2 }, out: "qualityResult" } 
); 

通過發射 「1」 爲您每filtername的價值,你得到像

{_id: "filterOne", values[1,1,1]}, 
{_id: "filterTwo", values[1,1]} 

結果通過與價值觀做Array.sum,你會得到每個過濾器的出現次數。

+0

這工作。非常感謝你。但是,我有超過800萬個文件,而且這個解決方案非常慢。我使用了AMITAVA的Aggregation查詢,這對我來說效果更好。無論如何,再次感謝。 :) –

相關問題