Как создать правильные фильтры с Flask и PyMongo? - PullRequest
0 голосов
/ 26 сентября 2019

Мой первый пост здесь:)

Я использую Flask и PyMongo для своего сайта и хочу, чтобы у пользователя была возможность фильтровать результаты базы данных.Для начала просто:

Базовый фильтр будет возвращать результаты, основанные на аргументе цены.Если цена равна None, я хочу вернуть все результаты.

Из документов MongoDB:

Оператор $ or выполняет логическую операцию ИЛИ для массива из двух или более выражений.и выбирает документы, которые удовлетворяют хотя бы одному из выражений

   price = request.args.get('price')
   if price:
       price = int(price)

   posts = db.collection.find({ '$or' : [
                                {'price' : {'$lt' : price }},
                                {'price' : {'$ne' : None }}
                                ]
                              })

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

Также немного вопросов борадера - что, если я хочуиметь несколько фильтров?Должен ли я создать один большой запрос к базе данных, используя оператор $ и, и манипулировать значениями переменных, чтобы получить желаемый результат?Или есть лучший способ?Единственное, о чем я думал, это маршрут для каждого фильтра, но это не похоже на то, что будет работать.Любые предложения приветствуются!Спасибо!

1 Ответ

1 голос
/ 26 сентября 2019

РЕДАКТИРОВАТЬ:

Для нескольких фильтров:

filter = {}
if price is not None: filter['price'] = {'$lt' : price }
if quantity is not None: filter['quantity'] = {'$lt' : quantity }
if volume is not None: filter['volume'] = {'$lt' : volume }

posts = db.testcollection.find(filter)

ORIGNAL:

Попробуйте сохранить себянемного сумасшедший в мире булевой логики:

if price is None:
    filter = {}
else:
    filter = {'price' : {'$lt' : price }}

posts = db.collection.find(filter)
...