如何从存储在 mongodb 中的对象中获取日期?

Posted

技术标签:

【中文标题】如何从存储在 mongodb 中的对象中获取日期?【英文标题】:How to get date from object stored in mongodb? 【发布时间】:2020-12-04 02:38:42 【问题描述】:

我正在制作一个包含聊天和帖子的应用程序,并且在聊天中,我想显示最近帖子的时间。 下面是我的 mongoose 帖子模式的日期部分,以及我的 Mongodb 日期字段的样子。

我正在尝试将日期发送到前端,但不确定如何格式化。我想将其格式化为昨天下午 12:45 或 6 天前等。 非常感谢任何帮助。

Mongoose Schema field for date:

     date: 
        type: Date,
        default: Date.now
      

Mongodb data field

【问题讨论】:

这个答案可能对您有所帮助。 mongodb-nodejs-how-to-query-isodate-fields Mongo 将始终以有效的日期格式存储它,您必须使用转换器来解析它以在 UI 上显示它。因为它永远是一个相对的问题,所以今天就是明天的昨天。 【参考方案1】:

Mongo(几乎?世界上没有其他数据库)存储诸如“昨天”或“上周”之类的常量。

像“昨天”这样的概念的问题在于它非常语义化。如果是 00:01 是昨天 2 分钟前?如果答案是肯定的,那么您实际上必须每分钟更新一次数据库,如果您愿意妥协以查看时差,您仍然必须每天都这样做。

我不确定您的实际业务需求是什么让您想要这样做。但我建议您在获取文档时这样做。否则这是不可扩展的。

这是一个关于如何做到这一点的简单示例:

db.collection.aggregate([
  
    "$addFields": 
      currDay: 
        "$dayOfMonth": "$$NOW"
      ,
      dateDay: 
        "$dayOfMonth": "$date"
      ,
      dayGap: 
        "$divide": [
          
            "$subtract": [
              "$$NOW",
              "$date"
            ]
          ,
          86400000/**miliseconds in a day*/
          
        ]
      
    
  ,
  
    $addFields: 
      date: 
        "$switch": 
          "branches": [
            
              "case": 
                $and: [
                  
                    $lt: [
                      "$dayGap",
                      1
                    ]
                  ,
                  
                    $eq: [
                      "$dateDay",
                      "$currDay"
                    ]
                  
                ]
              ,
              "then": "today"
            ,
            
              "case": 
                $lt: [
                  "$dayGap",
                  2
                ]
              ,
              "then": "yesterday"
            ,
            
              "case": 
                $lt: [
                  "$dayGap",
                  1
                ]
              ,
              "then": "today"
            
          ],
          default: 
            "$concat": [
              
                "$toString": 
                  "$round": "$dayGap"
                
              ,
              " days ago"
            ]
          
        
      
    
  
],

  allowDiskUse: true
)

MongoPlayground

如您所见,您必须为每个选项手动构建所需的“短语”。你显然可以在代码中做同样的事情,我只是选择显示“Mongoi”的方式,因为我觉得更复杂。

如果您最终选择提前更新数据库,您可以使用与$out 结合使用的同一管道来实现此目的。

最后一点是我作弊了,因为这个聚合只关注毫秒差异(today 字段除外)。意思是如果它是凌晨 1 点,那么 50 小时前。即使日期是“三天”前,仍会显示为两天前。

我希望这个例子能告诉你为什么这种格式没有在任何地方使用,以及它带来的困难。请注意,我什至没有提出像“昨天”这样的时区概念,对于不同的地区来说更具语义化。

在我的选择中,唯一可行的“真正”解决方案是构建一个在代码中执行此操作的自定义函数。请注意,这不是很有趣,因为您必须考虑间隔年、时区、地理区域等事件,但它是可行的。

【讨论】:

以上是关于如何从存储在 mongodb 中的对象中获取日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 mongo db 获取详细信息并在 nodejs Fork 方法中发送或存储在对象中

从对象 id 中提取日期并将其导出到 mongodb 中的 csv

如何从 MongoDB 中的数组中查询具有最新日期的对象?

mongodb,保存后截断日期时间的毫秒数

如何从 mongodb 获取数据以放入选项中?

Spring数据mongodb存储库语法中的@Query注释