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"
}
私はqualityInfo
フィールドの各値のれる発生し、出力に次のような結果に何かをカウントします。
{
"_id" : "FilterOne",
"count" : "42"
}
{
"_id" : "FilterTwo",
"count" : "30"
}
{
"_id" : "FilterThree",
"count" : "12"
}
{
"_id" : "FilterFour",
"count" : "43"
}
私は集約操作がMapReduce
よりもはるかに高速であることを気づいたようAggregation
を介してこれを実現することを好むだろう。私がそうでなければ私を修正してください。それで集約によってそれをすることは可能ですか?そうでない場合、私はすでに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'の前に来なければなりません。そして、私は最初の質問に「$一致」を持っています。それは動作します。ありがとうございました! –
うれしいです。私の意見では、次の段階に行くのは単なるオプションなので、$ projectionは何の問題も起こらないはずです。ここには見えないものがあり、問題を引き起こしたものと$ matchがあると思います。 – AMITAVA