Как я могу вернуть все значения из цикла for в запросе python3 mongodb - PullRequest
0 голосов
/ 04 июня 2019

У меня есть функция, которая запрашивает коллекцию mongodb

def checkDb():
    signals =  mydb['collection']
    findInMongo =  signals.find({}, {'_id': False})
    for x in findInMongo:
        return x

Я хочу вернуть все из коллекции, не печатая ее на консоль. Когда я запускаю приведенный выше код, я получаю один результат:

{'Date': testvalue, 'Open': testvalue, 'High': testvalue, 'Low': testvalue, 'Close': testvalue, 'Volume':testvalue}

Когда я бегу

def checkDb():
    signals =  mydb['collection']
    findInMongo =  signals.find({}, {'_id': False})
    for x in findInMongo:
        print(x)

Я получаю каждый документ из своей коллекции, чего я и хочу. Как я могу заставить код возвращать каждый отдельный документ вместо использования print?

1 Ответ

1 голос
/ 04 июня 2019

Проблема в том, что вы используете 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()] синтаксис

...