Как сделать массовый поиск документов монго с постом в Еве?

Я использую Eve (флешку) как интерфейс API для mongodb. Сейчас я пытаюсь настроить массовый поиск предметов по этому интерфейсу. Это означает, что я хочу найти документы оптом.

Обычно вы используете для этого get. Так, например, если у вас есть набор лиц с полями имя и номер телефона, вы можете запросить конечную точку / имя человека или меньше и получить соответствующий документ, включая номер телефона.

Если вы хотите просмотреть несколько документов одновременно, скажем, следуя нашему примеру, вам нужен номер телефона нескольких человек, поиск каждого человека в отдельности будет дорогостоящим, т.е. для получения телефонных номеров потребуется много времени.

Вы можете использовать что-то вроде? Where={"name" $ ​​in ["Pedro", "Juan"]}, чтобы получить телефонные номера для двух человек с одним запросом get, что более эффективно (= быстрее), чем выполнение двух запросов get по одному на каждого. Однако этот метод имеет ограниченную применимость, поскольку максимальная длина запросов на получение составляет около 64 КБ ( 1), что означает, что таким способом можно получить только порядка тысячи документов, если мы предположим, что длина имени составляет около 10-20 символов.

Таким образом, естественный метод для больших поисков - использование почтовых запросов. Однако, насколько я вижу, интерфейс eve post предназначен для вставок, а не для поиска (найти).

Я вручную реализовал пост-поиск для некоторых конечных точек с помощью фляги, но есть ли способ использовать Еву для этого? Кстати, есть ли способ выполнить массовый поиск документов с помощью почтовых запросов?

1 ответ

Решение

Вы можете использовать динамический фильтр поиска. По сути, вы подключаете функцию обратного вызова к каждому запросу GET. В обратном вызове обновите lookup по мере необходимости ( источник):

def pre_GET(resource, request, lookup):
    lookup["name"] = {'$in': list_of_names}


 app = Eve()

 app.on_pre_GET += pre_GET
 app.run()

Или вы можете даже установить предопределенный фильтр данных (источник):

people = {
    'datasource': {
        'filter': {'username': {'$exists': True}}
        }
}

Второй вариант делает фильтр статическим, но вы все равно можете смешивать его с динамическим фильтром.

В целом, все это плохо пахнет дизайном. Я не знаю ваш вариант использования, но рассмотрим альтернативу, например, введение поля customer_type для запроса. Это, вероятно, упростит как производительность, так и обслуживание кода.

В любом случае, если вы делаете запросы, POST не место для поиска.

Другие вопросы по тегам