Мангуст игнорирует столбец из find, если значение равно null

#javascript #mongoose

#javascript #мангуст

Вопрос:

Допустим, я получил модель mongoose и значение, основанное на случайности

 const findUser = async (username, email) => {
  let foo = null
 
  if (Math.random() > 0.5) foo = "hi" // `foo` now has a chance of turning from null to "hi"

  UserModel.find({ "username": username, "email": email, "winner": foo === null ? 'EXCLUDE THIS SEARCH VALUE' : foo
}
  

^ This is some real code, in combination with some pseudo code ^

Я могу добиться этого следующим образом:

 const findUser = async (username, email) => {
  let foo = null
 
  if (Math.random() > 0.5) foo = "hi" // `foo` now has a chance of turning from null to "hi"

  let resu<
  if(foo === null)
    result = await UserModel.find({ "username": username, "email": email });
  else
    result = await UserModel.find({ "username": username, "email": email, "winner": foo });
  // ^^ Now I have to type the same thing all over again..
  // I'm wondering if there is a way to include it conditionally?
}
  

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

Ответ №1:

Возможно, есть более простой / лучший способ добиться этого, но кое-что, что я бы сделал в этом сценарии, — это создать объект, подобный этому.

 const findUser = async (username, email) => {
  let foo = null

  let query = {
   username,
   email
  }
 
  if (Math.random() > 0.5) foo = "hi" // `foo` now has a chance of turning from null to "hi"

  if (foo != null) {
    query.winner = foo;
  }

  UserModel.find(query);
}

  

По сути, создайте объект по умолчанию с вашими свойствами в нем, который всегда будет там. Затем проверьте, не равно ли ваше значение foo null. И если оно не равно null, то добавьте его в свой запрос и передайте этот объект запроса в find.

Ответ №2:

Вы могли бы извлечь свой запрос в переменную, а затем манипулировать ею на основе значения foo .

 const findUser = async (username, email) => {
   let foo = null

   if (Math.random() > 0.5) foo = "hi"

   const query = { username, email }

   if (foo) {
      query.winner = foo
   }

   const result = await UserModel.find(query)
}