Как добавить локальную переменную в pymongo.find, если это не None? - PullRequest
0 голосов
/ 05 ноября 2019

Я запускаю веб-сервис с функцией api, которая использует метод, который я создал для взаимодействия с MongoDB, используя pymongo.

Данные json, поставляемые с post, могут включать или не включать поле: firm. Я не хочу создавать новый метод для постов, который не включает поле firm.

Так что я хочу использовать этот firm в pymongo.find, если он существует, или я хочупросто пропустите это, если это не так. Как я могу сделать это с использованием одной функции API и одного метода pymongo?

API-функция:

@app.route(f'/{API_PREFIX}/wordcloud', methods=['POST'])
def generate_wc():
    request_ = request.get_json()
    firm = request_.get("firm").lower()
    source = request_["source"]
    since = datetime.strptime(request_["since"], "%Y-%m-%d")
    until = datetime.strptime(request_["until"], "%Y-%m-%d")

    items = mongo.get_tweets(firm, since, until)

    ...

Pymongoметод:

def get_tweets(self, firm: str, since: datetime, until: datetime):
    tweets = self.DB.tweets.find(
        {
            # use firm here if it exists (I mean not None), else just get items by date
            'date': {'$gte': since, '$lte': until}
        })
    ...

Здесь во втором коде строка комментария в find.

Спасибо.

1 Ответ

1 голос
/ 07 ноября 2019

Поскольку он включает в себя два разных запроса: {date: ...} и {date: ..., firm: ...} в зависимости от наличия firm во входных данных, вам придется проверить, не является ли firm не None в get_tweets, и выполнитьправильный запрос.

Например:

def get_tweets(self, since, until, firm=None):
    query = { 'date': { '$gte': since, '$lte': until } }
    if firm is not None:
        query['firm'] = firm
    tweets = self.DB.tweets.find(query)
    ....

Обратите внимание, что, поскольку firm имеет значение по умолчанию, оно должно быть последним в списке параметров get_tweets.

...