Node.js 为什么这个Mongo查询返回奇怪的结果?

Node.js 为什么这个Mongo查询返回奇怪的结果?,node.js,mongodb,api,Node.js,Mongodb,Api,我使用Node和MongoDB作为api。我试图从数据库中获取结果,这些结果根据设备id进行过滤,设备id工作正常,并且根据时间戳整数进行过滤。用户可以选择设置开始时间、结束时间、两者或两者都不设置。所有数据似乎都发送正确,但结果很奇怪,似乎不合逻辑,所以我显然做错了什么 以下是对数据库的调用: exports.findByDeviceId = (id, start, end, cb) => { // start and end times provided if (start !

我使用Node和MongoDB作为api。我试图从数据库中获取结果,这些结果根据设备id进行过滤,设备id工作正常,并且根据时间戳整数进行过滤。用户可以选择设置开始时间、结束时间、两者或两者都不设置。所有数据似乎都发送正确,但结果很奇怪,似乎不合逻辑,所以我显然做错了什么

以下是对数据库的调用:

exports.findByDeviceId = (id, start, end, cb) => {
  // start and end times provided
  if (start !== undefined && end !== undefined) {
    let query = db.entries.find({
      $and: [
        {device_id: id},
        {timestamp: {$gte: start}},
        {timestamp: {$lte: end}}
      ]
    }).sort({index: 1})
    console.log('start and end')
    query.toArray((err, myEntries) => {
      if (err) return cb(err, null)
      else {
        return cb(null, myEntries)
      }
    })
    // only start time provided
  } else if (start !== undefined && end === undefined) {
    let query = db.entries.find({
      $and: [
        {device_id: id},
        {timestamp: {$gte: start}}
      ]
    }).sort({index: 1})
    console.log('only start')
    query.toArray((err, myEntries) => {
      if (err) return cb(err, null)
      else {
        return cb(null, myEntries)
      }
    })
    // only end time provided
  } else if (start === undefined && end !== undefined) {
    let query = db.entries.find({
      $and: [
        {device_id: id},
        {timestamp: {$lte: end}}
      ]
    }).sort({index: 1})
    console.log('only end')
    query.toArray((err, myEntries) => {
      if (err) return cb(err, null)
      else {
        return cb(null, myEntries)
      }
    })
    // no time constraints provided  WORKS CORRECTLY
  } else {
    db.entries.find({device_id: id}).sort({index: 1}).toArray((err, myEntries) => {
      console.log('no start, no end')
      if (err) return cb(err, null)
      else {
        return cb(null, myEntries)
      }
    })
  }
}
为了测试这一点,我有两个条目,一个时间戳为500,第二个时间戳为10000。以下是我得到的一些奇怪的结果:

?start=0   Both entries show up; as expected
?start=200 Only the entry with timestamp of 500 gets returned; both are expected
?start=700 Neither is returned; entry with timestamp 10000 is expected

?end=0     Neither entry is returned; as expected
?end=501   Both are returned; only entry with timestamp 500 is expected
?end=499   Only entry with 10000 is returned; Neither are expected
我还没有测试当同时指示开始和结束时会发生什么

如果重要的话,在数据库中,timestamp字段是一个Int32字段

知道我做错了什么吗?似乎问题在于我使用$gte和$lte。这些都是文件。他们似乎很直截了当

感谢您的帮助

编辑:以下是一个示例条目:

{"_id":"xyz","index":1,"serial":"123","spent_c":0,"temp_c":2354,"direction":0,"battery":98,"timestamp":1519773832,"rh_c_1":0,"rh_c_2":0,"tp_c_1":2354,"tp_c_2":2374,"remain_c":10000,"device_id":"abc"}

这个问题很有趣,虽然在我看来,时间戳字段不是整数比较,而是字符串比较

500>200,但在字符串比较中10000<200


其他情况也是如此。请检查实际使用的数据类型,并正确地将开始和结束转换为int

您的模式是什么样子的?你能举一个运行这些查询时所查看数据的例子吗?我添加了一个示例条目。如果你还需要什么,请告诉我。我想你是对的。目前,开始和结束是字符串,而不是整数。谢谢让我来确定,然后我会选择你的答案。