python – map_reduce()*和* find()在同一个查询中

我发现了一堆map_reduce教程,但它们似乎都没有“where”子句或其他任何方式来排除正在考虑的文档/记录.我正在研究一个看似简单的查询.我有一个带有时间戳,IP地址和活动ID的事件的基本日志文件.我想获得给定广告系列在给定时间戳范围内的唯一身份用户数.听起来很简单!

我构建了一个查询对象,如下所示:

{‘ts’:{‘$gt’:1345840456,’$lt’:2345762454},’cid’:’2636518’}

有了这个,我尝试了两件事,一件使用distinct,另一件使用map_reduce:

不同

db.alpha2.find(查询).distinct( ‘IP’).COUNT()

在mongo shell中,你可以将查询作为distinct函数的第二个参数,它可以在那里工作,但我已经读过你在pymongo中不能这样做了.

Map_reduce

map = Code("function () {"
        "    emit(this.ip, 1);"
        "}")
reduce = Code("function (key, values) {"
    "  var total = 0;"
    "  for (var i = 0; i < values.length; i++) {"
    "    total += values[i];"
    "  }"
    "  return total;"
    "}")

totaluniqueimp = db.alpha2.map_reduce(map, reduce, "myresults").count();

(我意识到reduce函数正在做我不需要的东西,我从演示中获取它).这很好,但不使用我的“where”参数.我试试这个:

totaluniqueimp = db.alpha2.find(query).map_reduce(map, reduce, "myresults").count();`

我收到这个错误:

AttributeError: 'Cursor' object has no attribute 'map_reduce'

结论

基本上,这是我在mysql中尝试做的事情:

select count(*) from records where ts<1000 and ts>900 and campaignid=234 group by ipaddress

看起来很简单!你是如何在蒙戈做到这一点的?

更新:答案

根据Dmitry在下面的回答,我能够解决(并简化)我的解决方案(这是我能做到的那么简单吗?):

#query is an object that was built above this
map = Code("function () { emit(this.ip, 1);}")
reduce = Code("function (key, values) {return 1;}")
totaluniqueimp = collection.map_reduce(map, reduce, "myresults", query=query).count();

谢谢德米特里!

解决方法:

你可以尝试使用这个:

totaluniqueimp = db.alpha2.map_reduce(map, reduce, {
    out: "myresults",
    query: {'ts': {'$gt': 1345840456, '$lt': 2345762454}, 'cid': '2636518'}
}).count();

更新:上面的语句适用于mongo shell.在pymongo中,您应该将查询添加为第四个参数:

totaluniqueimp = db.alpha2.map_reduce(map, reduce, "myresults", query={'ts': {'$gt': 1345840456, '$lt': 2345762454}, 'cid': '2636518'})

详细文档可以在here找到.

上一篇:python – 以可测试的方式连接到mongodb


下一篇:Python MongoDB 入门