Невозможно правильно напечатать размер запроса mon go - PullRequest
0 голосов
/ 14 февраля 2020

В настоящее время я пытаюсь распечатать содержимое запроса mon go, приведя его к списку и затем пытаясь получить доступ к длине этого списка. Я использую следующий код:

from pymongo import MongoClient
from elasticsearch import Elasticsearch
from datetime import datetime
from dateutil.parser import parse
from pprint import pprint


client = MongoClient('...')
db_profile = client['...-profiles']

collection_profile = db_profile['profiles']

# print(collection_profile.count())

querydate = datetime(2020, 1, 1)
year = querydate.year
month = querydate.month
yesterday = querydate.day
dateStr = str(year) + "-" + str(month) + "-" + str(yesterday)
date = parse(dateStr)

result = collection_profile.find({'createdAt': {'$gte': date}})
pprint(list(result)) # Here I got the data correctly
print(len(list(result))) # Here I got 0 as result

Если я переключу положение последних двух строк, я получу правильный размер, но затем пустой список. Что может быть не так? Есть ли лучший способ для доступа к содержанию запроса, используя pymongo?

1 Ответ

2 голосов
/ 14 февраля 2020

Поскольку функция поиска является итератором, вы можете только go пройти через нее один раз. После того как ваш первый pprint(list(result)) итератор result достиг конца запроса. С этого момента он больше не будет возвращать данные.

Вам потребуется сохранить первое преобразование списка в переменной, чтобы снова получить доступ к содержимому:

resultList = list(result)
pprint(resultList)     # will use list that is now in memory
print(len(resultList)) # this will work

Если у вас есть очень большой набор результатов, это может привести к переполнению памяти или снижению производительности. Mon go может вернуть счет с помощью функции count () коллекции, в которую вы можете передать тот же объект запроса.

...