Как отфильтровать и выбрать определенные поля из mongodb в запросе GET?

#javascript #node.js #mongodb #mongoose

Вопрос:

Я только начал работать с мангустом/mongodb и node.js чтобы создать бэкэнд собственного приложения react, над которым я работаю. Мне становится довольно комфортно запрашивать документы в базе данных из узла, но как мне установить эти «фильтры» в запросе GET (с использованием выборки) с внешнего интерфейса?

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

Тот же вопрос, если я хочу возвращать только определенные поля, а не возвращать каждое поле в документе mongodb. Как я могу сообщить серверной части, какие поля возвращать со стороны клиента?

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

Спасибо всем, кто может помочь!

Ответ №1:

То, что вы ищете, — это язык запросов-синтаксис для передачи параметров запроса на сервер. Есть несколько вариантов.

Некоторые сайты решают поддерживать только простые запросы. Самым простым языком запросов в данном случае является строка запроса GET. Например, если вы создаете онлайн-магазин, вашим клиентам, как правило, потребуется искать товары по названию и по категориям, и поэтому вы можете получить два параметра строки запроса, которые вы поддерживаете в URL-адресах, например:
/products?category=clothesamp;search=t-shirt

Затем ваше приложение должно обрабатывать каждый из этих параметров независимо — ваш сервер должен знать, как превратить это в запрос MongoDB. Например:

 products.find({
  category: { $eq: req.query.category },
  $text: { $search: req.query.search }
  // similarly, you could accept params such as "pricemin" and "pricemax"
  //  and construct a { $gt, $lt } query
});
 

Для более сложных систем или приложений, требующих большей гибкости, вы можете позволить клиенту самостоятельно создать полный запрос и передать его на серверную часть для оценки. Существует множество решений, которые позволяют вам достичь этого — GraphQL является популярным выбором в последнее время благодаря хорошей поддержке инструментов и простоте использования. Другим хорошо известным решением является OData, который используется в некоторых высококлассных API, таких как Microsoft Graph API.

При использовании расширенного языка запросов вашей серверной части всегда нужно будет переводить между форматом, отправленным на сервер, и форматом, используемым базой данных. Самый простой, не общий пример-приведенный выше фрагмент кода, хотя решения, включающие батареи, обычно поставляются со своими собственными переводчиками, поэтому вам, возможно, не потребуется самостоятельно писать код, если существует пакет, который делает это за вас.