string - Mongo:字符串转换为日期但不是“可查询的”
问题描述
我有一个日期存储为字符串YYYY-mm-DD_HH:MM:SS.UUUZ的集合,例如2020-10-20_12:15:22.123+0100
我的目标是查询将这些字符串视为日期的字符串。
我在做什么:我正在展开多个文档上的一些标题数据:
{
"$unwind": {
"path": "$events",
"preserveNullAndEmptyArrays": true
}
}
并且
{
"$unwind": {
"path": "$events.hi2",
"preserveNullAndEmptyArrays": true
}
}
我正在添加一个用解析为日期的字符串创建的新字段
{
"$addFields": {
"events.hi2.ConnectTimets": {
"$dateFromString": {
"dateString": "$events.hi2.ConnectTime",
"format": "%Y-%m-%d_%H:%M:%S.%L%Z"
}
}
}}
然后在一个$match
阶段,我尝试过滤日期早于 2020 年 6 月 1 日的所有记录:
{
"$match":{
"events.hi2.ConnectTimets": {
"$gt": {"$dateFromString": {
"dateString": "2020-06-01",
"format": "%Y-%m-%d"
}
}
}
}
}
我的结果是Fetched 0 record(s) in 0ms
即使数据库中存在(至少一个文档)且日期与过滤器匹配:
{
"_id" : ObjectId("5f438dfbf1feb13c4352e9f4"),
"timestamp" : NumberLong(1598262779045),
"attribute1" : [
"common"
],
"events" : [
{
"eventType" : "ty1",
"timestamp" : NumberLong(1598262779018),
"docId" : NumberLong(282578800148736),
"hi2" : {
"Priority" : 3,
"ClientId" : "client1",
"ConnectTime" : "2020-08-24_09:52:58.993+0000",
"Direction" : 1
}
},
{
"eventType" : "ty2",
"timestamp" : NumberLong(1598262781071),
"docId" : NumberLong(282578800148736),
"hi2" : {
"ref" : "bbbb"
}
}
]
}
当我想到类似的东西时
{
"_id" : ObjectId("5f438dfbf1feb13c4352e9f4"),
"timestamp" : NumberLong(1598262779045),
"attribute1" : [
"common"
],
"events" : [
{
"eventType" : "ty1",
"timestamp" : NumberLong(1598262779018),
"docId" : NumberLong(282578800148736),
"hi2" : {
"Priority" : 3,
"ClientId" : "client1",
"ConnectTime" : "2020-08-24_09:52:58.993+0000",
"Direction" : 1
}
}
}
注意_:添加字段是可以的,因为如果我在没有匹配阶段的情况下触发它,则会输出一个字段,其中字符串解析为日期
解决方案
您永远不应该将日期/时间值存储为字符串,始终使用正确的Date
对象。那么查询就简单多了:
db.logging.aggregate([
{
$addFields: {
"events.hi2.ConnectTimets": {
$dateFromString: {
dateString: "$events.hi2.ConnectTime",
format: "%Y-%m-%d_%H:%M:%S.%L%Z"
}
}
}
},
{ $match: { "events.hi2.ConnectTimets": { $gte: ISODate("2020-06-01") } } }
])
当您必须使用日期/时间值时,我推荐moment.js。然后您的查询可能如下所示:
{ $match: { "events.hi2.ConnectTimets": { $gte: moment("2020-06-01").toDate() } } }
{ $match: { "events.hi2.ConnectTimets": { $gte: moment("2020-06-01").tz('Europe/Zurich').toDate() } } }
{ $match: { "events.hi2.ConnectTimets": { $lte: moment.tz('Europe/Zurich').endOf('day').toDate() } } }
推荐阅读
- grads - 在 GrADS 中显示用户指定的等高线级别
- python - 递归正则表达式仅在递归之前的匹配开始时进行模式匹配?
- c - minGW项目中w32api有什么用
- ios - 第三方框架的 Xcode 代码覆盖率
- python - 基于python中现有的数据框列创建多个新数据框
- javascript - 如何更改 pdf 页面上的图标?
- ios - 按 tabbar 并在 prefersLargeTitles = true iOS 中调用 Scroll to top
- deep-learning - 为什么 CNN 中使用的图像大小通常是特定数字?
- dart - 如何通过手势传递到下面的对象?
- javascript - Vuejs SSR、Laravel 和 PHP V8Js 问题“窗口未定义”