#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 => {
//...
});