数据库schema是date类型 查询时提示 右值类型不正确

数据库schema是date类型 查询时提示 右值类型不正确

操作步骤:

{
    "bsonType": "object",
    "properties": {
        "startDate": {
            "bsonType": "date",
            "description": "开始时间"
        }
    }
}
const dbCmd = db.command
const $ = dbCmd.aggregate
// db.collection('date-test').add({
//  startDate: new Date()
// })

db.collection('date-test').where({
    startDate: dbCmd.lte(new Date())
}).get()

预期结果:

查询结果

实际结果:

报错 右侧值类型不正确

bug描述:

{
    "bsonType": "object",
    "properties": {
        "startDate": {
            "bsonType": "date",
            "description": "开始时间"
        }
    }
}
const dbCmd = db.command
const $ = dbCmd.aggregate
// db.collection('date-test').add({
//  startDate: new Date()
// })

db.collection('date-test').where({
    startDate: dbCmd.lte(new Date())
}).get()

提示<=类型不正确

查询时用时间戳不报错但是搜不出来

用getTemp 再联表查是正常的


6 回复

不会要倒闭吧,所有问题都石沉大海呢。。


时间字段的类型 bsonType 应该是 timestamp 代表时间戳, 不建议用 Date 类型, 数据库大于等于的判断作用于数值(number)类型 timestamp 本质就是number, 和string类型(按ASCII码大小比)

感谢解答,但是我看文档 https://doc.dcloud.net.cn/uniCloud/cf-database-dbcmd.html#dbcmd-compare 里说date可以用来比较呢

而且getTemp 是不报错的,联表查询也正常

回复 x***@126.com: 建议用时间戳,因为date有时区问题,特别是在阿里云和腾讯云那是0时区的

这个错误是因为在使用云数据库查询时,Date类型的比较需要特殊处理。正确的查询方式应该是:

  1. 对于直接比较Date对象,应该使用数据库的特定方法:
db.collection('date-test').where({
  startDate: dbCmd.lte(new Date())
}).get()
  1. 如果仍然报错,可以尝试将Date转换为时间戳进行比较:
db.collection('date-test').where({
  startDate: dbCmd.lte(Date.now())
}).get()
  1. 或者使用聚合操作中的日期处理:
db.collection('date-test').aggregate()
  .match({
    $expr: {
      $lte: ["$startDate", new Date()]
    }
  })
  .end()
回到顶部