使用时间戳查找()

时间:2018-04-13 15:03:18

标签: mongodb date timestamp mongodb-query

我试图查询MongoDB集合以查找两个日期之间的警报。问题是日期是时间戳。我的代码是:

rs.slaveOk();
print("mac;inicio;fin;valor_inicial;valor_actual");
db.alarmas.find(
{   
   timestamp_inicio_alarma:
        {
            $gt: ISODate("2018-02-01T00:00:00.000Z"),
            $lt: ISODate("2018-02-28T23:59:59.000Z")
        },
        valor_inicial: {$eq: 'ON: AC Line Fail'},
        estado_alarma: {$eq: 'SOLUCIONADA'}
        }
   ).forEach(function(alarmas){
        print(alarmas.mac+";"+alarmas.timestamp_inicio_alarma+";"+alarmas.timestamp_fin_alarma+";"+alarmas.valor_inicial+";"+alarmas.valor_actual);
   }
);

数据格式为:

enter image description here

问题是它找不到任何东西。我怎么才能正确查询?

非常感谢你。 MongoDB对我来说是一个工具,我不是程序员。

2 个答案:

答案 0 :(得分:0)

根据您的屏幕截图timestamp_inicio_alarma被保留为Int64而不是Date。我猜测timestamp_inicio_alarma中的值是纪元秒。

因此,您尝试对包含数字日期的文档属性应用基于日期的查询。这就是您的查询不匹配的原因。

以下查询将与屏幕截图中显示的文档相匹配...

db.alarmas.find({ 
    timestamp_inicio_alarma: { $gt: 1457029620, $lt: 1457029640}
})

...但是,当然,这很难理解(谁知道1457029620在日期方面的含义;)。

所以,要么:

  • 你的模特改变了;坚持timestamp_inicio_alarma作为约会。如果是这样,那么您在问题中表达查询的方式将是有效的。
  • 您的查询更改;将日期表示为自纪元以来的秒数(假设timestamp_inicio_alarma中的vaule)。例如:

    var start = ISODate("2018-02-01T00:00:00.000Z").getTime() / 1000;
    var end = ISODate("2018-02-28T23:59:59.000Z").getTime() / 1000;
    
    db.alarmas.find({ 
        timestamp_inicio_alarma: { $gt: start, $lt: end}
    })
    

答案 1 :(得分:0)

如果您需要按数字字段(时间戳)查找任何文档,则可以将此数字传递给Date

db.alarmas.find({
  timestamp_inicio_alarma: { 
    $gt: new Date(start),
    $lt: new Date(end) 
  }
})

其中开始和结束是时间戳的示例:1601949824094