2017-02-22 3 views
1

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

Для каждого элемента я должен выполнить поиск в другой коллекции и применить функцию к результату.

Первый алгоритм я придумал был:

for document in collection1.find(): 
    field1 = document['field'] 
    search = collection2.find({'field': field1}) 
    # Do some stuff with the search 

Но выполняя поиск для каждого элемента просто занимает слишком много времени, потому что он должен ждать ответа сервера каждый раз.

Чтобы сократить время ожидания на элемент, я пытаюсь использовать партии -все 500 документов одновременно.

Единственный способ, которым я нашел, как это сделать, используя следующий метод() на курсоре

cursor = collection1.find() 
while cursor.alive: 
    batch_data = [] 
    for i in range(500): 
      batch_data.append(cursor.next()) 
    fields = [i['field'] for i in bath_data]: 
    search = collection2.find({'field': {"$in": fields}}) 
    # map each result to the correct document and then do my stuff 

Однако это, кажется, очень Hacky. Есть ли способ выполнить поиск в коллекции и вернуть результат в виде списка партий заданного размера?

ответ

0

Если я правильно понял, вы пытаетесь присоединиться к двум коллекциям в поле. Если вы используете версию MongoDB 3.2 или более поздней версии, вы можете попробовать $lookup operator в структуре агрегации. Это эквивалент левого внешнего соединения в реляционных базах данных. Но я не уверен в этом, если pymongo поддерживает это или нет. Если он не поддерживает его, возможно, вы можете использовать операторы $ limit и $ skip, чтобы не загружать всю коллекцию в память. Вы можете получить документацию pymongo от here.

+0

PyMongo не нужно ничего делать, чтобы поддерживать $ lookup, он передает весь конвейер агрегации на сервер, независимо от того, какие операторы вы укажете. –

+0

Спасибо, я буду помнить об этом. –