2013-02-26 5 views
8

Mam db w mongo, że mam dostęp z pymongo.Jak mogę zwrócić tablicę obiektów mongodb w pymongo (bez kursora)? Czy MapReduce może to zrobić?

Chciałbym móc przeciągnąć mały zestaw pól na listę słowników. Tak, coś co mi się w powłoce Mongo po wpisaniu ...

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

chciałbym oświadczenie Pythona jak:

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

gdzie x jest strukturą tablicy jakiegoś raczej niż kursorem --- czyli zamiast iteracji, jak:

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

Czy to możliwe, że mogę używać MapReduce przynieść to do jednej liniowej? Coś jak

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

mam zamiar wyjścia zbioru danych do badań dla niektórych analiz, ale chciałbym skoncentrować się na IO w Pythonie.

Odpowiedz

21

nie trzeba zadzwonić mapreduce, wystarczy włączyć kursor do listy tak:

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

gdzie col jest twoim obiektem db.collection.

Ale ostrożność przy dużych/dużych wynikach powoduje, że każda rzecz jest załadowana do pamięci.

+0

Czy to ogólna rzecz Pythona, której nie znałem? list() na obiekcie kursora wymusza kursor na wartości, na które wskazuje? – Mittenchops

+0

jest rzeczą językową - w JavaScript (czyli w powłoce mongo można to zrobić w ten sposób: db.coll.find(). ToArray() - zmienia kursor w tablicę wyników –

+0

W przypadku gdyby ktoś chciał tylko jedno pole zwrócone z bazy danych, czy możliwe jest utworzenie listy właśnie tego pola, jak np. (np. w twoim przykładzie dla "a"): >>> dane [1.0, 2.0] ? – jaivalis

2

Co można zrobić, to zadzwonić mapreduce w pymongo i przekazać zapytanie find jako argumentu, to może być tak:

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

O występów myślę, że trzeba by zrobić je w posiadają funkcję zmniejszyć, gdyż tylko zapytania określić kryteria wyboru, jak to mówi w mongo documentation

Powiązane problemy