Параметры запроса Mongodb ( объединить $ gt с $ in )

#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