使用 NodeJs 和 mongodb 使用 gt、gte、lt、lte 进行过滤

问题描述 投票:0回答:1

我尝试在 NodeJs 后端项目中使用 Filter() 函数,这是我的函数:

constructor(query, queryStr ){ 
    this.query = query; 
    this.queryStr = queryStr; } 
filter() { 
    const queryCopy = { ...this.queryStr }; 
    // Removing some fields for category 
    const removeFields = ["keyword", "page", "limit"];    
    removeFields.forEach((key) => delete queryCopy[key]);

    // Filter For Price and Rating

    let queryStr = JSON.stringify(queryCopy);
    queryStr = queryStr.replace(/\b(gt|gte|lt|lte)\b/g, (key) => `$${key}`);

    this.query = this.query.find(JSON.parse(queryStr));
    console.log(queryStr)
    
    return this;
  }

我正在使用邮递员发送带有 URL 的请求: http://localhost:4000/api/v1/products?price%5Blt%5D=2000&price%5Bgte%5D=1200

虽然我的数据库中有价格=1200的产品,但它没有发送任何产品。另一个问题是当我记录我的 (queryStr) 时,它看起来像这样: {"价格[$lt]":"2000","价格[$gte]":"1200"}

我的期望是: {"价格":{[$lt]":"2000","[$gte]":"1200"}}

我认为这是我问题的主要原因,请帮助我

node.js mongodb postman
1个回答
0
投票
const a = {'price[lt]': 2000, 'price[gte]': 1200, 'other': 'parameters'};

console.log(a); // { 'price[lt]': 2000, 'price[gte]': 1200 }

let finalObject = {};
for (const i of Object.keys(a)) {
    const key = i.match(/(price|amount)/)?.shift(); // modify your key params here ex: price, amount etc..
    const expr = i.match(/\b(gt|gte|lt|lte)\b/)?.shift();
    if (key && expr) {
        if (finalObject[key]) Object.assign(finalObject[key], { [`[$${expr}]`]: a[i] });
        else Object.assign(finalObject, { [key]: { [`[$${expr}]`]: a[i] }});
    } else Object.assign(finalObject, { [i]: a[i] });
}
console.log('finalObject...', finalObject); // {"price":{"[$lt]":2000,"[$gte]":1200},'other':'parameters'}
© www.soinside.com 2019 - 2024. All rights reserved.