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

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

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

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

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

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

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


person ben26941    schedule 24.09.2015    source источник
comment
Я не уверен, что понимаю, чего вы хотите достичь. Не могли бы вы отредактировать и добавить пример к своему вопросу?   -  person Nicola Iarocci    schedule 25.09.2015
comment
Добавил пример, ура.   -  person ben26941    schedule 26.09.2015


Ответы (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 не место для поиска.

person Nicola Iarocci    schedule 28.09.2015