Pymongo使用map reduce计算字段存在的所有文档

时间:2012-11-04 09:28:28

标签: javascript mongodb pymongo nosql

我正在尝试使用Map + Reduce计算某个字段存在的所有文档(在本例中为“country”字段),唯一对我有用的解决方案是:

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)}}

谢谢:)

1 个答案:

答案 0 :(得分:1)

Per Chien-Wei Huang 评论,为什么不使用内置功能,例如。

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

如果你想要一些令牌地图减少代码,你可以通过 group()函数来模拟计数功能,例如。

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

注意:如果您还想要按国家/地区计算值,请将以下内容添加到密钥中:     ,key {“country”:1}