Проблема в том, что вы используете return
, когда вы, вероятно, хотите yield
:
def checkDb():
signals = mydb['collection']
findInMongo = signals.find({}, {'_id': False})
for x in findInMongo:
return x # This will exit after the first result
return
выходит из функции, она буквально возвращает значение из функции, выходя из области видимости. yield
, с другой стороны, будет продолжать генерировать значения, пока итератор не будет исчерпан (или у findInMongo
больше нет элементов в цикле for
).
Вместо этого сделайте
def checkDb():
signals = mydb['collection']
findInMongo = signals.find({}, {'_id': False})
for x in findInMongo:
yield x
# which allows you to do
vals = list(checkDb())
Потому что checkDb()
теперь является итератором (или, точнее, генератором). Более поздние версии python3 также представили красивый yield from
синтаксис
def checkDb():
signals = mydb['collection']
findInMongo = signals.find({}, {'_id': False})
yield from findInMongo # yield from a collection directly
Или вы можете просто вернуть findInMongo
, если это итератор
def checkDb():
signals = mydb['collection']
findInMongo = signals.find({}, {'_id': False})
return findInMongo # return the iterator directly
Все они будут поддерживать list(checkDb())
или [x for x in checkDb()]
синтаксис