日期范围之间的MongoDB查询
在我的mongodb中,日期列是字符串。它的日期时间为2020年8月3日13:50:19 我无法进行任何日期范围查询。它返回了错误的结果 我的代码如下:日期范围之间的MongoDB查询,mongodb,pymongo,Mongodb,Pymongo,在我的mongodb中,日期列是字符串。它的日期时间为2020年8月3日13:50:19 我无法进行任何日期范围查询。它返回了错误的结果 我的代码如下: { "$match": { "event.meterID.string": meter_no, "event
{
"$match": {
"event.meterID.string": meter_no,
"event.dataTime.string": {
"$gte": prev,
"$lte": dt_string
}
}
}
非常感谢您的帮助
{ "_id" : ObjectId("5f2707da47973204ce5e9d91"), "header" : { "endpointKeyHash" : { "string" : "mO5KmJVhbZMXAUrVD0uKIKf32/I=" }, "applicationToken" : { "string" : "96775772132708234336" }, "headerVersion" : { "int" : 1 }, "timestamp" : { "long" : NumberLong("1596393434007") }, "logSchemaVersion" : { "int" : 4 } }, "event" : { "meterID" : { "string" : "83.67.68.65.48.48.49.49" }, "rkw" : { "double" : -4492 }, "rkwh" : { "double" : 2 }, "rkvar" : { "double" : -2331 }, "rkv" : { "double" : 6499574 }, "rcurrent" : { "double" : 29367 }, "rhz" : { "double" : 50021 }, "rpf" : { "double" : 650 }, "ykw" : { "double" : 0 }, "ykwh" : { "double" : 0 }, "ykvar" : { "double" : 0 }, "ykv" : { "double" : 6524626 }, "ycurrent" : { "double" : 15370 }, "yhz" : { "double" : 0 }, "ypf" : { "double" : 0 }, "bkw" : { "double" : 0 }, "bkwh" : { "double" : 0 }, "bkvar" : { "double" : 0 }, "bkv" : { "double" : 6616274 }, "bcurrent" : { "double" : 34841 }, "bhz" : { "double" : 0 }, "bpf" : { "double" : 0 }, "dataTime" : { "string" : "8/3/2020 00:04:43" } } }
正如注释中所述,问题在于日期存储为字符串,而不是正确的
datetime
数据类型。在字符串字段中,当您使用$lte
和$gte
运算符时,MongoDB将以字符串(字典顺序)而不是日期来比较值
除了将存储的日期转换为datetime
,还有几个选项:
yyyy-mm-ddThh:mm:ss
,则也可以将其作为字符串进行比较datetime
字段,这样不仅支持比较,还支持时区转换、对日期子字段进行筛选(例如,查找特定日期或月份的所有文档)等
修正了日期开关。否则,答案是正确的。向我们展示一些文档无论将日期/时间值存储为字符串,请使用适当的
date
对象。我已共享了该文档。
{
"$addFields": {
"eventDateTime": {
"$dateFromString": {
"dateString": "$event.dataTime.string",
format: "%d/%m/%Y %H:%M:%S"
}
}
}
},
{
"$match": {
"event.meterID.string": meter_no,
"eventDateTime": {
"$gte": prev,
"$lte": date_object
}
}
}