Я работаю с коллекцией 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. Есть ли способ выполнить поиск в коллекции и вернуть результат в виде списка партий заданного размера?
PyMongo не нужно ничего делать, чтобы поддерживать $ lookup, он передает весь конвейер агрегации на сервер, независимо от того, какие операторы вы укажете. –
Спасибо, я буду помнить об этом. –