我對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結果中返回_id
和value
中的名稱字符串即可。
此查詢給我一個空的結果。根本不值一提。 –
好的,我得到了問題。 '$ project'應該放在'$ unwind'之前。我在查詢中也有一個'$匹配',我在開始時就提出了這個問題。所以它工作。謝謝! –
很高興它正在工作。在我看來,$投影不應該引起任何問題,因爲它只是進入下一個階段的一個選項,我想你有$匹配的東西在這裏是不可見的,哪些是導致問題的原因。 – AMITAVA