$gte 和 $lte 在 Mongoose/MongoDB 中没有按预期工作

Posted

技术标签:

【中文标题】$gte 和 $lte 在 Mongoose/MongoDB 中没有按预期工作【英文标题】:$gte & $lte is not working as expected in Mongoose/MongoDB 【发布时间】:2021-07-12 02:57:41 【问题描述】:

我正在按价格范围过滤产品列表。有些价格范围很好,有些则不行。 当我单击(单选框)前端的价格范围时,它会通过价目表在后端进行处理。 看起来 $gte 和 $lte 没有按预期工作。我错过了什么吗?

反应前端 ---- 价目表:

export const prices = [
    
        _id:0,
        name: 'Any',
        array: []
    ,
    
        _id:1,
        name: '$50 to $99',
        array: [50, 99]
    ,
    
        _id:2,
        name: '$100 to $199',
        array: [100, 199]
    ,
    
        _id:3,
        name: '$200 to $299',
        array: [200, 299]
    ,
    
        _id:4,
        name: '$300 to $399',
        array: [300, 399]
    ,
    
        _id:5,
        name: '$400 to $599',
        array: [400, 599]
    ,
    
        _id:6,
        name: '$600 to $799',
        array: [600, 799]
    ,
]

NodeJS 后端 -------- 产品搜索列表:

exports.listBySearch = (req, res) => 
    let order = req.body.order ? req.body.order : "desc";
    let sortBy = req.body.sortBy ? req.body.sortBy : "_id";
    let limit = req.body.limit ? parseInt(req.body.limit) : 100;
    let skip = parseInt(req.body.skip);
    let findArgs = ;

    // console.log(order, sortBy, limit, skip, req.body.filters);
    // console.log("findArgs", findArgs);

    for (let key in req.body.filters) 
        if (req.body.filters[key].length > 0) 
            if (key === "price") 
                // gte -  greater than price [0-10]
                // lte - less than
                findArgs[key] = 
                    $gte: req.body.filters[key][0],
                    $lt: req.body.filters[key][1]
                ;
                console.log(findArgs)
               // console.log --  price:  '$gte': 50, '$lt': 99.99  
             else 
                findArgs[key] = req.body.filters[key];
            
        
    

    Product.find(findArgs)
        .select("-images")
        .populate("category")
        .sort([[sortBy, order]])
        .skip(skip)
        .limit(limit)
        .exec((err, data) => 
            if (err) 
                return res.status(400).json(
                    error: "Products not found"
                );
            
            res.json(
                size: data.length,
                data
            );
        );
;

猫鼬 --------- 数据库:


    "_id" : ObjectId("6079a8d675db7021c00aa973"),
    "sold" : 5,
    "name" : "Java Book for Everyone",
    "description" : "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book.",
    "price" : "75",
    "category" : ObjectId("605c9c94dcf90b34e8ec33e0"),
    "shipping" : false,
    "quantity" : 7,
    "createdAt" : ISODate("2021-04-16T15:10:14.626Z"),
    "updatedAt" : ISODate("2021-04-16T15:10:14.626Z"),
    "__v" : 0

【问题讨论】:

【参考方案1】:

mongoDB 文档中的价格是string 类型。 这就是为什么查询不起作用。 您想将 mongo 中的 price 值转换为 number 以进行比较。 修改查询以发送如下内容:


  $expr: 
    $and: [
      $gte: [
        $toDouble: "$price"
      , req.body.filters[key][0]],
      $lt: [
        $toDouble: "$price"
      , req.body.filters[key][1]]
    ]
  

【讨论】:

我太笨了,我没有注意到这一点。谢谢队友:)

以上是关于$gte 和 $lte 在 Mongoose/MongoDB 中没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

$match 与 $gte 和 $lte 不适用于 mongodb 中的数组? [复制]

$match 与 $gte 和 $lte 不适用于 mongodb 中的数组? [复制]

65.ORM查询条件:gte,gt,lte和lt的使用

MongoDB 查询 lte 比 gte 快

包含greaterThanEqual(gte)或lessThanEqual(lte)的Squeryl查询给出错误/无结果

MongoDB $关键字 关系比较符号 $lt $lte $gt $gte $ne