13

我在 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 中。

4

3 回答 3

30

您不需要调用 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 对象。

但是要小心大/巨大的结果,因为每件事都会被加载到内存中。

于 2013-03-01T12:24:14.443 回答
2

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

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

关于预测,我认为您需要在 reduce 函数中执行它们,因为查询仅指定选择标准,如mongo 文档中所述

于 2013-02-26T15:56:41.110 回答
0

基于 Asya 的回答:如果您想要每个条目中只有一个值的列表而不是对象列表 - 使用列表推导对我有用。

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

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

更多在这里

于 2018-12-27T01:21:33.677 回答