@justmavi
Software Development Engineer at Softconstruct

Можно ли пропустить null?

Вот модель

const schema = new Schema({
    // ....
    conditions: {},
    // ....
});


Conditions - вложенный документ и в нём можно сохранить что угодно с любым ключом (ну, немного иначе. Здесь будут поля из другой модели, но некоторые могут отсутсовать). И допустим у нас в conditions:

{
    "conditions": {
        "age": 10,
        "name": "John"
    }
}


Это находится на базе. Теперь, я хочу найти этот документ, но т.к. я не знаю, какие там поля, сталкиваюсь с проблемом...

const conditions = {
    'conditions.age': 10,
    'conditions.name': 'John',
    'conditions.surname': 'White' // surname там нет
}
const result = await Model.find(conditions);
console.log(result) // [];


И вот вопрос, можно ли исключить из фильтра поля, которые отсутствуют в документе ? Чтобы find их просто пропускал, не учитывал... Заранее спасибо. )
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
@justmavi Автор вопроса
Software Development Engineer at Softconstruct
Решение

const validConditions = {
    $and: [
      {
        $or: [
          { 'conditions.age': { $exists: false } },
          { 'conditions.age': 20 },
        ],
      },
      {
        $or: [
          { 'conditions.name': { $exists: false } },
          { 'conditions.name': 'John' },
        ],
      },
      {
        $or: [
          { 'conditions.surname': { $exists: false } },
          { 'conditions.surname': 'White' },
        ],
      },
    ],
  };

  const result = await Test.find(validConditions);


Хватило просто составлять запрос для SQL...

SELECT * FROM entries WHERE age = 20 OR age IS NULL AND name = 'John' OR name IS NULL AND surname = 'White' OR surname IS NULL
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы