• MongoDB——将时间戳转换为日期


    语法:


        $dateFromString: {
            dateString: ,
            format: ,
            timezone: ,
            onError: ,
            onNull:
        } 
    }
     语法说明:

    (1)dateString: :代表的是需要转换成日期的字符串表达式

    (2)format: :可选,代表的是转换格式表达式,默认使用:"%Y-%m-%dT%H:%M:%S.%LZ"

    (3)timezone: :可选,代表的是转换成日期时使用的时区的表达式

    (4)onError: :可选,代表的是转换失败时的处理方式的表达式

    (5)onNull: :可选,代表的是Null的情况下的处理方式的表达式

    从 timestamp 转换为日期取决于我们保存时间戳的类型。它是对象、数字还是字符串类型

    我们可以在 mongo shell 上使用以下命令检查字段的类型。在本教程中,我们将学习如何将时间戳转换为数字、字符串或对象类型的日期。

    检查字段类型:

    1. // MongoDB 5.0.8
    2. > typeof db.collection_name.findOne().fieldName;

    一、当时间戳为数字类型时,将时间戳转换为日期

    示例代码(用于 collection1):

    1. // MongoDB 5.0.8
    2. > db.collection1.insertMany([
    3. {"_id": 1, "datetime": new Date().getTime()}, //saves timestamp in milliseconds
    4. {"_id": 2, "datetime": new Date().getTime()},
    5. {"_id": 3, "datetime": new Date().getTime()},
    6. {"_id": 4, "datetime": new Date().getTime()},
    7. {"_id": 5, "datetime": new Date().getTime()}
    8. ]);
    9. > db.collection1.find();

     输出:

    1. { "_id" : 1, "datetime" : 1655448286502 }
    2. { "_id" : 2, "datetime" : 1655448286502 }
    3. { "_id" : 3, "datetime" : 1655448286502 }
    4. { "_id" : 4, "datetime" : 1655448286502 }
    5. { "_id" : 5, "datetime" : 1655448286502 }

     检查 datetime 字段的类型:

    1. // MongoDB 5.0.8
    2. > typeof db.collection1.findOne().datetime;

    输出:

    number

    一旦集合准备好并且我们知道字段类型,我们可以使用以下方法将时间戳转换为日期并计算每个日期的条目。

    示例代码(用于 collection1):

    1. // MongoDB 5.0.8
    2. > db.collection1.aggregate([
    3. {
    4. "$project": {
    5. "_id": { "$toDate": "$datetime" }
    6. }
    7. },
    8. {
    9. "$group": {
    10. "_id": { "$dateToString": { "format": "%Y-%m-%d", "date": "$_id" }},
    11. "count": { "$sum": 1 }
    12. }
    13. }
    14. ]);

    输出:

    { "_id" : "2022-06-17", "count" : 5 }
    

    在这里,我们使用 $project 聚合阶段,它从指定集合中获取文档并告知字段的包含、_id 字段的抑制、新字段的添加以及重置现有字段的值。

    在 $project 阶段,我们使用 $toDate 聚合将 datetime 字段的值转换为日期,并将其保存在 _id 字段中,该字段进一步传递给 $group 聚合阶段。

    在这个阶段,我们使用 $dateToString 聚合管道运算符将指定的 date 对象按照指定的格式转换为字符串,并保存在 _id 字段中,进一步用于对文档进行分组。

    $dateToString 采用 timestampdate 或 ObjectId,根据用户指定的格式进行进一步转换,而 $sum 仅返回数值的总和。

    最后,我们按项目对文档进行分组,这里是 _id。请记住,_id 现在包含一个字符串值,因为我们根据用户指定的格式将指定的日期转换为字符串。

    二、当时间戳为字符串类型时,将时间戳转换为日期

    示例代码(用于 collection2):

    1. // MongoDB 5.0.8
    2. > db.collection2.insertMany([
    3. {"_id": 1, "datetime": "1655445247168"},
    4. {"_id": 2, "datetime": "1522838153324"},
    5. {"_id": 3, "datetime": "1513421466415"},
    6. {"_id": 4, "datetime": "1515488183153"},
    7. {"_id": 5, "datetime": "1521571234500"}
    8. ]);
    9. > db.collection2.find();

    输出:

    1. { "_id" : 1, "datetime" : "1655445247168" }
    2. { "_id" : 2, "datetime" : "1522838153324" }
    3. { "_id" : 3, "datetime" : "1513421466415" }
    4. { "_id" : 4, "datetime" : "1515488183153" }
    5. { "_id" : 5, "datetime" : "1521571234500" }

    检查 datetime 字段的类型:

    1. // MongoDB 5.0.8
    2. > typeof db.collection2.findOne().datetime;

    输出:

    string
    

    在这个集合中,我们有字符串格式的时间戳。因此,我们可以使用以下解决方案将其从时间戳转换为日期,并按日期对它们进行分组。

    示例代码(用于 collection2):

    1. // MongoDB 5.0.8
    2. > db.collection2.aggregate([
    3. {
    4. "$project": {
    5. "_id": { "$toDate": { "$toLong": "$datetime" }}
    6. }
    7. },
    8. {
    9. "$group": {
    10. "_id": { "$dateToString": { "format": "%Y-%m-%d", "date": "$_id" } },
    11. "count": { "$sum": 1 }
    12. }
    13. }
    14. ]);

    输出:

    1. { "_id" : "2018-03-20", "count" : 1 }
    2. { "_id" : "2017-12-16", "count" : 1 }
    3. { "_id" : "2022-06-17", "count" : 1 }
    4. { "_id" : "2018-04-04", "count" : 1 }
    5. { "_id" : "2018-01-09", "count" : 1 }

    此代码与前面的示例相同,但有一点不同。在这里,我们首先使用 $toLong 将 datetime 字段从字符串类型转换为数字类型,然后使用转换后的值使用 $toDate 转换为日期。

    三、当时间戳为对象类型时,将时间戳转换为日期

    示例代码(用于 collection3):

    1. // MongoDB 5.0.8
    2. > db.collection3.insertMany([
    3. {"_id":1, "datetime": new Timestamp()},
    4. {"_id":2, "datetime": new Timestamp()},
    5. {"_id":3, "datetime": new Timestamp()},
    6. {"_id":4, "datetime": new Timestamp()},
    7. {"_id":5, "datetime": new Timestamp()}
    8. ]);
    9. > db.collection3.find();

    输出:

    1. { "_id" : 1, "datetime" : Timestamp(1655448393, 1) }
    2. { "_id" : 2, "datetime" : Timestamp(1655448393, 2) }
    3. { "_id" : 3, "datetime" : Timestamp(1655448393, 3) }
    4. { "_id" : 4, "datetime" : Timestamp(1655448393, 4) }
    5. { "_id" : 5, "datetime" : Timestamp(1655448393, 5) }

    检查 datetime 字段的类型:

    1. // MongoDB 5.0.8
    2. > typeof db.collection3.findOne().datetime;

    输出:

    object
    

    这次我们可以使用以下解决方案将时间戳转换为日期并计算每个日期的条目。

    示例代码(用于 collection3):

    1. // MongoDB 5.0.8
    2. > db.cybertron_datasource_execution_record.aggregate([
    3. {
    4. "$match":{
    5. "dataSourceId": {
    6. $in: [77, 83]
    7. },
    8. "requestTime": {
    9. $gte: 1609430400000,
    10. $lt: 1689436800000
    11. }
    12. }
    13. },
    14. {
    15. "$project": {
    16. "dataSourceId": "$dataSourceId",
    17. "_id":"$requestTime"
    18. }
    19. },
    20. {
    21. "$group": {
    22. "_id": {
    23. "dataSourceId": "$dataSourceId",
    24. "restTime": {
    25. "$dateToString": {
    26. "format": "%Y-%m",
    27. "date": {"$add":[new Date(0),"$_id"]}
    28. }
    29. }
    30. },
    31. "count": {
    32. "$sum": 1
    33. }
    34. }
    35. }
    36. ]);

    输出:

    1. 2023-07 525
    2. 2023-06 213
    3. 2023-05 321
  • 相关阅读:
    HTML+CSS+JS网页设计期末课程大作业——上海旅游景点(10页)web前端开发技术 web课程设计 网页规划与设计
    C++ | Leetcode C++题解之第35题搜索插入位置
    如何写新闻软文宣传考核稿,媒体发布后效果作用是什么
    AIOps探索 | 应急处置中排障的降本增效方法探索(上)
    SQL中LIKE和REGEXP简单对比
    程序设计与数据结构_周立功【读书笔记】
    Java的线程实现
    读写锁ReentrantReadWriteLock&StampLock详解
    那些破釜沉舟入局Web3.0的互联网精英都怎么样了?
    Python测网络连通性、能否访问某个网络或者端口号<网络检测、ping主机、测试端口>
  • 原文地址:https://blog.csdn.net/zhanglongfei1016/article/details/132978254