MongoDB中基于Timestamp查询指定日期区间告警的技术问询
解决MongoDB Timestamp类型日期范围查询问题
首先,我注意到你遇到的核心问题是字段类型不匹配:你的timestamp_inicio_alarma是BSON Timestamp类型,但查询时用了ISODate(Date类型)来做范围匹配,MongoDB对类型匹配要求严格,这会导致查询无法匹配到预期数据。
下面一步步帮你解决这个问题:
1. 确认字段的实际类型
先执行这条命令,确认timestamp_inicio_alarma的类型:
db.alarmas.findOne({}, { timestamp_inicio_alarma: 1, _id: 0 })
如果返回结果是类似{ "timestamp_inicio_alarma" : Timestamp(1517443200, 0) },说明确实是Timestamp类型,接下来就需要调整查询条件的类型。
2. 将查询日期转换为Timestamp类型
MongoDB的Timestamp构造函数需要两个参数:Unix时间戳(秒)和递增序数(通常传0即可)。你需要把目标日期转换成对应的Unix秒数:
2018-02-01T00:00:00.000Z对应的Unix秒数是15174432002018-02-28T23:59:59.000Z对应的Unix秒数是1519862399
修改后的查询代码如下:
rs.slaveOk(); // 4.4+版本可以用rs.secondaryOk()替代 print("mac;inicio;fin;valor_inicial;valor_actual"); db.alarmas.find({ timestamp_inicio_alarma: { $gt: Timestamp(1517443200, 0), $lt: Timestamp(1519862399, 0) }, valor_inicial: 'ON: AC Line Fail', // $eq可以省略,直接写值更简洁 estado_alarma: 'SOLUCIONADA' }).forEach(function(alarm) { // 处理字段可能不存在的情况,避免报错 const mac = alarm.mac || 'N/A'; const inicio = alarm.timestamp_inicio_alarma || 'N/A'; const fin = alarm.timestamp_fin_alarma || 'N/A'; // 补全你代码中省略的结束时间字段 const valorInicial = alarm.valor_inicial || 'N/A'; const valorActual = alarm.valor_actual || 'N/A'; print(`${mac};${inicio};${fin};${valorInicial};${valorActual}`); });
3. 额外优化建议
- 如果需要动态计算日期的Timestamp,可以用
Date对象先获取时间戳,再转换:
这样就不用手动查Unix时间戳了,更灵活。const startDate = new Date("2018-02-01T00:00:00.000Z"); const endDate = new Date("2018-02-28T23:59:59.000Z"); // 转换为秒级时间戳 const startTimestamp = Timestamp(Math.floor(startDate.getTime() / 1000), 0); const endTimestamp = Timestamp(Math.floor(endDate.getTime() / 1000), 0); - 给
timestamp_inicio_alarma字段创建索引,能大幅提升范围查询的性能:db.alarmas.createIndex({ timestamp_inicio_alarma: 1 })
内容的提问来源于stack exchange,提问作者NGabioud
相关产品推荐
相关产品推荐

