How can I return an array of mongodb objects in pymongo (without a cursor)? Can MapReduce do this?

扶醉桌前 提交于 2019-12-10 02:26:39

问题


I have a db set up in mongo that I'm accessing with pymongo.

I'd like to be able to pull a small set of fields into a list of dictionaries. So, something like what I get in the mongo shell when I type...

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

I'd like a python statement like:

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

where x is an array structure of some kind rather than a cursor---that is, instead of iterating, like:

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

Is it possible that I could use MapReduce to bring this into a one-liner? Something like

db.find({},{"variable1_of_interest":1, "variable2_of_interest":1}).map_reduce(mapper, reducer, "data")

I intend to output this dataset to R for some analysis, but I'd like concentrate the IO in Python.


回答1:


You don't need to call mapReduce, you just turn the cursor into a list like so:

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

where col is your db.collection object.

But caution with large/huge result cause every thing is loaded into memory.




回答2:


What you can do is to call mapReduce in pymongo and pass it the find query as an argument, it could be like this:

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

About the projections I think that you would need to do them in the reduce function since query only specify the selection criteria as it says in the mongo documentation




回答3:


Building off of Asya's answer: If you wanted a list of just one value in each entry as opposed to a list of objects--using a list comprehension worked for me.

I.e. if each object represents a user and the database stored their email, and you say wanted all the users that were 15 years old

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

More here



来源:https://stackoverflow.com/questions/15092884/how-can-i-return-an-array-of-mongodb-objects-in-pymongo-without-a-cursor-can

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!