我试图查询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);
}
);
数据格式为:
问题是它找不到任何东西。我怎么才能正确查询?
非常感谢你。 MongoDB对我来说是一个工具,我不是程序员。
答案 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