为什么此Mongo查询返回奇怪的结果?

时间:2019-08-03 18:26:39

标签: node.js mongodb api

我将Node和MongoDB用于api。我正在尝试从数据库中获取根据设备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

我还没有测试同时显示开始和结束的情况。

如果有关系,在数据库中,时间戳字段是Int32字段。

知道我在做什么错吗?看来问题出在我对$ gte和$ lte的使用上。 Here是这些文档。它们看起来非常简单。

感谢您的帮助。

编辑:这是一个示例条目:

{"_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"}

1 个答案:

答案 0 :(得分:1)

这个问题很有趣,尽管在我看来,它不是整数比较,而是时间戳字段的字符串比较。

500> 200但10000 <200(以字符串比较)

与其他情况类似。请检查数据类型是否确实在使用,并且您将startend正确地转换为int