如何在pymongo中返回一个mongodb对象数组(没有光标)? MapReduce可以这样做吗?

时间:2013-02-26 15:26:27

标签: mongodb pymongo

我在mongo中设置了一个数据库,我正在使用pymongo访问。

我希望能够将一小组字段拖入字典列表中。所以,就像我输入mongo shell时的内容......

db.find({},{"variable1_of_interest":1, "variable2_of_interest":1}).limit(2).pretty()

我想要一个python语句,如:

x = db.find({},{"variable1_of_interest":1, "variable2_of_interest":1})

其中x是某种类型的数组结构而不是游标---也就是说,而不是迭代,如:

data = []
x = db.find({},{"variable1_of_interest":1, "variable2_of_interest":1})
for i in x:
    data.append(x)

我是否有可能使用MapReduce将其带入单行内容?像

这样的东西
db.find({},{"variable1_of_interest":1, "variable2_of_interest":1}).map_reduce(mapper, reducer, "data")

我打算将此数据集输出到R进行某些分析,但我想将IO集中在Python中。

3 个答案:

答案 0 :(得分:24)

您不需要调用mapReduce,只需将光标转换为如下列表:

>>> data = list(col.find({},{"a":1,"b":1,"_id":0}).limit(2))
>>> data
[{u'a': 1.0, u'b': 2.0}, {u'a': 2.0, u'b': 3.0}]

其中col是你的db.collection对象。

但是对于大/大结果的警告导致每件东西都被加载到内存中。

答案 1 :(得分:2)

你可以做的是在pymongo中调用mapReduce并将查询作为参数传递给它,它可能是这样的:

db.yourcollection.Map_reduce(map_function, reduce_function,query='{}')

关于投影我认为您需要在reduce函数中执行它们,因为查询仅指定选择标准,如mongo documentation

中所述

答案 2 :(得分:0)

以Asya的答案为基础: 如果您只想在每个条目中只列出一个值而不是对象列表,那么使用列表理解对我有用。

即如果每个对象代表一个用户,并且数据库存储了他们的email,并且您说希望所有15岁的用户

user_emails = [user['email'] for user in db.people.find( {'age' : 15} )]

More here