Как сделать массовый поиск документов монго с постом в Еве?
Я использую 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 не место для поиска.