Можно ли пропустить несуществующее поле документа при поиске?
Вот модель
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 их просто пропускал, не учитывал... Заранее спасибо. )
Ответы (1 шт):
Автор решения: MRamsey
→ Ссылка
Решение
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