【问题标题】:Mongoose query does not return values when comparing string digits比较字符串数字时,Mongoose 查询不返回值
【发布时间】:2020-11-09 18:15:20
【问题描述】:

在过去的 9 个小时里,我正在尝试修复一个错误,所以我有代码

let query = User.find(); 
if(req.query.from){
    query = query.find({date: {$gte: req.query.from}});
}
if(req.query.to){
    query = query.find({date: {$lte: req.query.to}});
}
const User = await query;
res.status(200).json({status:'Success', User})

问题是当我这样做时

req.query.from = 1

req.query.to = 9

一切正常,但当我这样做时

req.query.from = 1

req.query.to = 11 

它不返回任何东西。

可以查询单个数字,但是如果我想将单个数字与多个数字混合,则不起作用。 谁能帮我解决这个问题

编辑:
我的用户架构

const userSchema= new mongoose.Schema({
    date: {
        type:String
    },
    title: {
        type:String
    },
    description:{
        type:String
    },
    location:{
        type:String
    }
});

【问题讨论】:

  • 您能否分享一些来自users 集合的示例文档,我们可以使用它们来测试查询,也许还可以分享User 架构定义?
  • @chridam 我刚刚更新
  • 不确定$gte$lte 是否与type:String 完美配合
  • 改成Date type
  • 请发布示例date 字段的值以及 req.query.from 值。为了正确比较,值及其格式在日期字段值的情况下很重要。

标签: node.js mongodb mongoose mongodb-query


【解决方案1】:

comparison query operators$gt$gte$lt$lte 通常不适用于字符串数字,因为 MongoDB 中的类型是严格的,并且不会像它们那样自动转换 在其他系统中。要与带有$gt/$gte$lt/$lte 的数字进行比较,文档中的值也需要是数字。因此,您可以选择更改 Date 字段的架构设计为 int 或 double。

对于您的情况,由于日期字段已经是字符串类型,您可以利用 $expr 运算符来转换查询中的字段,因为它与 $toInt$toDouble 等聚合运算符配合得很好。您还需要将参数值解析为整数,以便与查询进行正确比较。

因此,如果您决定坚持使用现有架构,您最终将需要这样的查询:

const users = await User.find({
    '$expr': {
        '$and': [
            { '$gte': [{ '$toInt': '$date' }, 1 ] },
            { '$lte': [{ '$toInt': '$date' }, 11 ] }
        ]
    }   
})

以下查询派生返回具有现有条件的所需结果:

const toIntExpression = { '$toInt': '$date' }
const query = { 
    '$expr': {
        '$and': []
    } 
}

if (req.query.from) {
    const from = parseInt(req.query.from, 10)
    query['$expr']['$and'].push({
        '$gte': [toIntExpression, from]
    })
}

if (req.query.to) {
    const to = parseInt(req.query.to, 10)
    query['$expr']['$and'].push({
        '$lte': [toIntExpression, to]
    })
}

const users = await User.find(query)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多