如何在猫鼬中建立动态查询?

时间:2019-01-04 18:42:57

标签: node.js mongodb mongoose

我需要使用以下示例数据来构建查询:

{
   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)

1 个答案:

答案 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 } });
}