фильтрация документов в mongodb с использованием узла js

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

Образец коллекции :

 {
  "_id":"5f8576462680760017f64c96",
  "projectType": "public",
  "status": "open",           //status can be open , ongoing or completed
  "budget": 1000,
  "revisionStatus": false,
  "projectName": "Adonis industry",
  "licenseType": "cs",
  "location": "Algeria",
  "description": "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum",
  "createdAt": "2020-08-13T09:41:26.391Z",
  "updatedAt": "2020-10-13T09:41:26.391Z"
  

Пользовательский интерфейс имеет 5 фильтров :

  • Местоположение: этот фильтр предназначен для получения всех проектов на основе местоположения. Это будет единственное значение в теле запроса. Формат, например — {"location": "xyz"}
  • LicenseType: этот фильтр предназначен для получения всех проектов на основе licenseType. Аналогично Location .
  • Дата публикации: этот фильтр предназначен для публикации проектов в определенном диапазоне дат. Он переходит к объекту в теле запроса. Формат, например — {"datePosted" : {"startDate" : "2020-10-11" , "endDate" : "2020-10- 09}}
  • Дата завершения: этот фильтр предназначен для получения всех проектов в пределах определенного диапазона дат и имеет статус завершенных. Формат снова такой же, как Date Posted
  • Бюджет проекта: этот фильтр предназначен для получения всех проектов в пределах определенного диапазона бюджета. Формат снова похож на Date Posted

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

Я не хочу использовать много IF-ElSEIF-ELSE , потому что есть много комбинаций, которые нужно проверить . Я знаю об Queries этом в mongoose, но я знаю, как он будет работать с объектами на картинке (поскольку это диапазон значений), а не только с одним значением.

Я хочу знать эффективный способ решения таких проблем и создать краткий, хорошо выполненный API.

Ответ №1:

В конце концов, вам нужно где-то в коде проверить, выполняются ли условия. Это обязательно, по крайней мере, пять if условий.

Итак, я думаю, что ясным и простым решением может быть что-то вроде этого.

С помощью этого вы можете использовать Query и объединять where() предложения, поэтому их очень легко читать.

 let query = model.find()
if (location) {
    query.where('location', 'Algeria')
}
if (licenseType) {
    query.where('licenseType', 'cs')
}
if (datePost) {
    query.where('createdAt').gte('2020-08-12').lte('2020-09-12')
}
if (dateCompleted) {
    query.where('status', 'completed')
    if(!datePost) query.where('createdAt').gte('2020-08-12').lte('2020-09-12')
}
if (projectBudget) {
    query.where('budget', 200)
}
     
query.exec().then(result => {
    //...
});