В следующей функции я пытаюсь динамически построить условие запроса mongo $or
.PriceRanges принимается в качестве параметра функции.Я строю priceRanges
следующим образом, чтобы построить оператор $or
для моей проекции:
let $or = [];
for(let filter of priceRanges) {
$or.push( { $gte: [ "$price", +filter.low ] }, { $lte: [ "$price", +filter.high ] })
}
Массив $or
теперь содержит следующие значения:
console.log('$or', $or)
$or [
{ '$gte': [ '$price', 100 ] }, { '$lte': [ '$price', 200 ] },
{ '$gte': [ '$price', 200 ] }, { '$lte': [ '$price', 300 ] },
{ '$gte': [ '$price', 300 ] }, { '$lte': [ '$price', 400 ] }
]
Здесь ясоздайте оператор проекта:
let $project = {
name:1,
producttype:1,
brand:1,
model:1,
price:1,
list_price:1,
description:1,
rating:1,
sku:1,
feature:1,
image:1,
images: 1,
specifications:1,
};
Я добавляю к проекции условие $or
:
$project.priceRange = {$or: $or};
Оператор $ or выглядит следующим образом:
{ '$or':
[ { '$gte': [Array] },{ '$lte': [Array] },
{ '$gte': [Array] }, { '$lte': [Array] },
{ '$gte': [Array] }, { '$lte': [Array] } ] }
Я создаю массив моих операторов проекции:
aggregateArray.push({$project: $project});
console.log(aggregateArray)
выглядит следующим образом:
aggregateArray [ { '$project':
{ name: 1,
producttype: 1,
brand: 1,
model: 1,
price: 1,
list_price: 1,
description: 1,
rating: 1,
sku: 1,
feature: 1,
image: 1,
images: 1,
specifications: 1,
priceRange: [Object] } },
{ '$skip': 1 },
{ '$limit': 4 } ]
Я выполняю проекцию следующим образом:
let products = await Product.aggregate(aggregateArray);
При выполнении оператор $or
не оказывает никакого влияния.Результат содержит случайные цены, а не указанные диапазоны.