использовать курсор как итератор с запросом - PullRequest
4 голосов
/ 29 марта 2012

Я читал про mongodb.Наткнулся на эту часть http://www.mongodb.org/display/DOCS/Tutorial Там написано -

> var cursor = db.things.find();
> printjson(cursor[4]);
{ "_id" : ObjectId("4c220a42f3924d31102bd858"), "x" : 4, "j" : 3 }

"При использовании курсора таким образом, обратите внимание, что все значения вплоть до самого высокого доступа (курсор [4] выше) загружаются в ОЗУв то же время. Это не подходит для больших наборов результатов, так как у вас не хватит памяти. Курсоры следует использовать в качестве итератора для любого запроса, который возвращает большое количество элементов. "

Как использовать курсоркак итератор с запросом? Спасибо за помощь

Ответы [ 3 ]

15 голосов
/ 29 марта 2012

Вы отметили, что используете pymongo, поэтому я дам вам два примера pymongo с использованием курсора в качестве итератора:

import pymongo
cursor = pymongo.Connection().test_db.test_collection.find()
for item in cursor:
    print item
    #this will print the item as a dictionary

и

import pymongo
cursor = pymongo.Connection().test_db.test_collection.find()
results = [item['some_attribute'] for item in cursor]
#this will create a list comprehension containing the value of some_attribute
#for each item in the collection

InКроме того, вы можете установить размер пакетов, возвращаемых драйверу pymongo, выполнив следующее:

import pymongo
cursor = pymongo.Connection().test_db.test_collection.find()
cursor.batchsize(20) #sets the size of batches of items the cursor will return to 20

Обычно нет необходимости связываться с размером пакета, но если на машине, на которой вы запускаете драйвер, естьПроблемы с памятью и сбой страницы, когда вы манипулируете результатами запроса, вам, возможно, придется установить это значение для достижения лучшей производительности (для меня это действительно кажется болезненной оптимизацией, и я всегда оставляю значение по умолчанию).

Что касается драйвера javascript (драйвера, который загружается при запуске «оболочки»), то эта часть документации предостерегает вас от использования «режима массива».Из интерактивного руководства:

Режим массива в оболочке

Обратите внимание, что в некоторых языках, таких как JavaScript, драйвер поддерживает «режим массива».Пожалуйста, проверьте подробности в документации к вашему драйверу.

В оболочке db, чтобы использовать курсор в режиме массива, используйте операции индекса массива [] и свойство length.

Режим массива загрузит все данныев оперативную память до самого высокого запрошенного индекса.Таким образом, его не следует использовать для любого запроса, который может возвращать очень большие объемы данных: вам не хватит памяти на клиенте.

Вы также можете вызвать toArray () для курсора.toArray () загрузит все запросы объектов в оперативную память.

2 голосов
/ 29 марта 2012

При использовании драйвера MongoDB Java это должно выглядеть примерно так:

DBCursor cursor = collection.find( query );
while( cursor.hasNext() ) {
     DBObject obj = cursor.next();
     // do something tih obj
}

В консоли mongo вы можете сделать что-то вроде:

var cursor = db.things.find();
while(cursor.hasNext()) { printjson(cursor.next()); }
1 голос
/ 29 августа 2016

MongoDB возвращает результаты в пакетном режиме. Чтобы увидеть, сколько объектов осталось в пакете, мы используем objLeftInBatch() следующим образом:


var c = db.Schools.find();
var doc = function() {return c.hasNext()? c.next : null;}
c.objLeftInBatch();

Чтобы перебрать этот пакет, мы можем использовать doc(), который мы настроили в приведенном выше блоке кода. Более подробную информацию о курсорах можно найти на https://docs.mongodb.com/

...