#node.js #mongodb #mongoose
#node.js #mongodb #mongoose
Вопрос:
Я использую библиотеку параметров запроса api, rooms=2,4,5amp;rooms>=6
это дает rooms: { '$gte': 6, '$in': [ 2, 4, 5 ] }
, что это не сработает, но если я буду искать только с rooms>=6
, это сработает или с rooms=2,4,5
. Как я могу объединить $ gte с $ in?
Ответ №1:
Звучит так, как вы хотите, ИЛИ если один и тот же ключ имеет несколько условий. (Мне нужны все номера, 2, 4, 5 ИЛИ больше 6.)
Чтобы сделать это в mongo:
$or: [
{rooms: { $gte: 6}},
{rooms: { $in: [2, 4, 5]}}
]
Комментарии:
1. Спасибо, все верно, у вас есть какая-нибудь библиотека, которая может упростить это?
2. @TodorPavlovic к сожалению, я не знаю ни одного.
Ответ №2:
Вы также можете использовать not in для вашего запроса, например db.inventory.find( { rooms: { $nin: [ 1, 6] } } )
Ответ №3:
Итак, ребята, я сделал это с помощью оператора $ nin.
Сначала я использую библиотеку api-query-params.
let { filter, skip, limit, sort } = aqp(req.query)
Он может анализировать параметры запроса — rooms=1,2,3,4,5
в 'rooms': { '$in': [ 4, 3, 2, 1, 0, 5 ] }
Но если мы хотим, чтобы при добавлении пользователем 5 было $ gte 5
function addOrOperator(filter, field) {
//if selected value is undefined return
if(!filter[field]) return;
//values to match
let array = [0,1,2,3,4,5];
//if 5 is only selected returned value is 'rooms': 5
if(filter[field] === 5) {
filter[field] = {
$gte: 5
}
}
if(filter[field].$in) {
if(filter[field].$in.includes(5)) {
let difference = array.filter(x => !filter[field].$in.includes(x));
filter[field] = {
$nin: [...difference, null, ""]
}
}
}
return filter;
}
Затем мы вызываем эту функцию внутри контроллера
addOrOperator(filter, 'rooms'); // all filters and key that we want to select