1

Map + Reduceを使用して、特定のフィールド(この場合は「国」フィールド)が存在するすべてのドキュメントを計算しようとしています。私にとって有効な唯一の解決策は次のとおりです。

mapper = Code("""
function () {
if (typeof this.country != 'undefined') { 
    var key = 1
    emit(key, {count: 1})
    };
};
""")

フィールドが存在する場合でも、キーにはあまり興味がないので、1を渡しました。しかし、それは間違いだと確信しています。

reducer = Code("""
function (key, values) {
    var sum = 0;
    values.forEach(function (value) {
        sum += value['count'];
    });
    return {count: sum};
};
""")

そして、map_reduceを呼び出します:

results = dbHandle.cards.map_reduce(mapReduce.mapper, mapReduce.reducer, "resultsMR")
for doc in results.find():
    print "Found %s documents." % int(doc.get('value').get('count'))

また、作成日が他の日付よりも大きいドキュメントの量を取得する方法を考えています。map_reduce関数で「クエリ」オプションを使用する必要がありますか?

query = {"foundationDate":{"$gt":datetime.datetime(2012, 1, 1, 00, 00, 00)}}

ありがとうございました :)

4

1 に答える 1

0

Chien -Wei Huang のコメントによると、組み込みの機能を使用しないのはなぜですか。

db.somName.find({"country":{"$exists":True}}).count() 

それ以外の場合は、トークンの map-reduce コードが必要な場合は、たとえばgroup()関数を使用して、単純にカウント機能を模倣します。

db.somName.group(
     { cond: { "country" : {$exists : true} }
      , key: { }
      , initial: {count : 0}
      , reduce: function(doc, out){ out.count++}
     }
  );

注: 国ごとの値も必要な場合は、キーに次を貼り付けます: , key { "country" : 1 }

于 2012-11-15T15:05:46.637 に答える