«Собираем вместе» запрос pymongo, основанный на наборе условий - PullRequest
1 голос
/ 03 января 2012

У меня есть набор условий, которые мне нужно использовать для извлечения некоторых данных из базы данных mongodb (используя pymongo).Некоторые из этих условий являются необязательными, а другие могут иметь более одного возможного значения.

Мне интересно, существует ли способ «динамического» построения запроса на пимонго на основе этих условий (вместо создания отдельных запросовдля каждой возможной комбинации условий).

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

  • tag содержит любой из this, is, a, tag
  • user является johnsmith
  • date_published до today

...where другой запрос может быть ограничен только следующим:

  • user is johnsmith
  • date_published после today

Резюме: Вместо того, чтобы создавать каждую возможную комбинацию условий, существует ли способ связать условия вместе, чтобы сформировать запрос в pymongo?

1 Ответ

4 голосов
/ 03 января 2012

Запрос PyMongo - это просто словарь Python, поэтому вы можете использовать все обычные методы для его создания на лету:

def find_things(tags=None, user=None, published_since=None):
    # all queries begin with something common, which may
    # be an empty dict, but here's an example
    query = {
        'is_published': True
    }
    if tags:
        # assume that it is an array of strings
        query['tags'] = {'$in': tags}
    if user:
        # assume that it is a string
        query['user'] = user
    if published_since:
        # assume that it is a datetime.datetime
        query['date_published'] = {'$gte': published_since}
    # etc...

    return db.collection.find(query)

Реальная логика, которую вы реализуете, очевидно, зависит от того, чем вы хотите варьировать свои вызовы поиска, это всего лишь несколько примеров. Вы также захотите проверить ввод, если он поступает из ненадежного источника (например, формы веб-приложения, параметров URL и т. Д.).

...