我需要使用以下示例数据来构建查询:
{
brandFilters:[ { brand: 'Amana', checked: true },
{ brand: 'Whirlpool', checked: true } ],
priceFilters:[ { low: 100, high: 200, label: '$100 - $200', checked: true },
{ low: 200, high: 300, label: '$200 - $300', checked: true } ],
rating: null }
查询的第一部分建立品牌条件,如下所示;
let brands = [];
let productQuery = Product.find();
if(filters.brandFilters.length) {
for(let filter of filters.brandFilters) {
brands.push(filter.brand)
}
productQuery.where('brand').in(brands)
console.log('brands', brands)
}
第二部分应该建立价格标准,如下所示:
if(filters.priceFilters.length) {
for(let filter of filters.priceFilters) {
productQuery.where('price').gte(+filter.low).lte(+filter.high);
}
}
目的是为每个价格过滤器添加一个“ where”子句,如上面的数据所示。问题是多个地方没有添加价格标准的条款。 for循环中的每个后续价格过滤器都会覆盖最后一个。因此,查询中只包含一个for循环的最后一次迭代,而不是为我的价格过滤器提供多个“ where”子句。
我正在尝试进行如下查询:
productQuery.where('brand').in(['Amana', 'Whirlpool'])
productQuery.where('price').gte(100).lte(200)
productQuery.where('price').gte(200).lte(300)
答案 0 :(得分:1)
因此,您要构建的查询应如下所示:
if(name == null)
{
return BadRequest("Please fill in everything");
}
因此它包含{
"$and":[
{"$or":[
{"price":{"$gte":100,"$lte":200}},
{"price":{"$gte":200,"$lte":300}}
]
},
{"brand":{"$in":["Amana","Whirlpool"]}}
]
}
以包括多个价格范围。为此,您可以将该查询构建为纯JavaScript对象,然后将其传递给$or
方法,请尝试:
find
然后
let query = {
'$and': []
};
var priceQuery = [];
let brands = [];
if(filters.priceFilters.length) {
for(let filter of filters.priceFilters) {
priceQuery.push({ 'price': { $gte: +filter.low, $lte: +filter.high } });
}
query['$and'].push({ '$or': priceQuery });
};
if(filters.brandFilters.length) {
for(let filter of filters.brandFilters) {
brands.push(filter.brand)
}
query['$and'].push({ 'brand': { '$in': brands } });
}