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

2023-09-18 14:54:31

在 MongoDB 中将时间戳转换为日期

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

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

检查字段类型:

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

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

示例代码(用于 collection1):

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

 输出:

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

 检查 datetime 字段的类型:

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

输出:

number

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

示例代码(用于 collection1):

// MongoDB 5.0.8
> db.collection1.aggregate([
{
"$project": {
"_id": { "$toDate": "$datetime" }
}
},
{
"$group": {
"_id": { "$dateToString": { "format": "%Y-%m-%d", "date": "$_id" }},
"count": { "$sum": 1 }
}
}
]);

输出:

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

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

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

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

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

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

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

示例代码(用于 collection2):

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

输出:

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

检查 datetime 字段的类型:

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

输出:

string

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

示例代码(用于 collection2):

// MongoDB 5.0.8
> db.collection2.aggregate([
{
"$project": {
"_id": { "$toDate": { "$toLong": "$datetime" }}
}
},
{
"$group": {
"_id": { "$dateToString": { "format": "%Y-%m-%d", "date": "$_id" } },
"count": { "$sum": 1 }
}
}
]);

输出:

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

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

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

示例代码(用于 collection3):

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

输出:

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

检查 datetime 字段的类型:

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

输出:

object

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

示例代码(用于 collection3):

// MongoDB 5.0.8
>  db.cybertron_datasource_execution_record.aggregate([
    {
				"$match":{
                    "dataSourceId": {
                        $in: [77, 83]
                    },
					"requestTime": {
							$gte: 1609430400000,
							$lt: 1689436800000
					}
				}
		},
		{
        "$project": {
                    "dataSourceId": "$dataSourceId",
					"_id":"$requestTime"
        }
    },
   {
        "$group": {
            "_id": {
                "dataSourceId": "$dataSourceId",
                "restTime": {
                    "$dateToString": {
                        "format": "%Y-%m",
                        "date": {"$add":[new Date(0),"$_id"]}
                    }
                }
            },
            "count": {
                 "$sum": 1
            }
        }
    }
]);

输出:

2023-07   525
2023-06   213
2023-05   321
更多推荐

并发编程系列 - ReadWriteLock

实际工作中,为了优化性能,我们经常会使用缓存,例如缓存元数据、缓存基础数据等,这就是一种典型的读多写少应用场景。缓存之所以能提升性能,一个重要的条件就是缓存的数据一定是读多写少的,例如元数据和基础数据基本上不会发生变化(写少),但是使用它们的地方却很多(读多)。针对读多写少这种并发场景,JavaSDK并发包提供了读写锁

国家高新技术企业认定,难点解析!

2022年国家高新技术企业认定最新变化从2021年开始,国家高新技术企业认定评审将进一步从严把控,新规定体现在:1、企业申报高企当年申请或转让的专利、知识产权不予计分,知识产权获得要有延续性,如企业所有知识产权获证的时间都是同一时间段,会被质疑为临时包装,不被认可或分数极低。2、企业系统填报的软件著作权,区级组织现场考

【Python】Python 时域到频域的变换方法

Python时域到频域的变换方法时域到频域的变换方法是信号处理中一个非常重要的概念,它将时域上的信号转换为频域上的信号,方便我们对信号频率特性的分析和处理。一、傅里叶变换傅里叶变换是时域到频域转换的一种常用方法,它将时域上的信号转换成一个连续的复数函数,表示信号在各个频率上的成分。在具体的实现中,可以使用Python中

再想一想GPT

一前言花了大概两天时间看完《这就是ChatGPT》,触动还是挺大的,让我静下来,认真地想一想,是否真正理解了ChatGPT,又能给我们以什么样的启发。二思考在工作和生活中,使用ChatGPT或文心一言,逐渐形成了习惯,总想听听它们的意见。无论是小学作文还是小的编程测试例子,大部分情况下还是能够给我一个比较靠谱的意见,而

JAXB(Java Architecture for XML Binding)下载、使用

简介JAXB(JavaArchitectureforXMLBinding)就是XML数据绑定的java架构。JAXB可以根据XMLSchema生成java类,也能根据java类生成XMLSchema,XML数据绑定指定了XML请求和XML响应如何映射成java对象。JAXB提供了API和工具,可以自动在XML文档和ja

激活函数总结(四十一):激活函数补充(ShiLU、ReLUN)

激活函数总结(四十一):激活函数补充1引言2激活函数2.1ShiLU激活函数2.2ReLUN激活函数3.总结1引言在前面的文章中已经介绍了介绍了一系列激活函数(Sigmoid、Tanh、ReLU、LeakyReLU、PReLU、Swish、ELU、SELU、GELU、Softmax、Softplus、Mish、Maxo

[C++ 网络协议] 套接字和标准I/O

1.标准I/O函数的优缺点优点一:标准I/O函数具有良好的移植性。为了支持所有系统,标准I/O函数都是按照标准来定义的。适用于所有编程领域。优点二:标准I/O函数可以利用缓冲提高性能。使用标准I/O函数会得到额外的缓冲支持,当创建套接字时,操作系统将会生成一个用于I/O的缓冲,同时,当你使用标准I/O函数,将会得到另一

8.gec6818开发板通过并发多线程实现电子相册 智能家居 小游戏三合一完整项目

并发前面编写的程序都是从mian函数开始,从上往下执行,称为顺序执行假设一个程序需要I输入C计算P输出,以顺序执行三个上述程序,则其执行过程如下:程序内部的语句是一条一条的执行,如果要运行多个程序,这些程序也是一个一个的依次执行,若上述的三种操作,每种操作需要的时间都是t,则执行上述三个程序共需要9t而在上述程序的执行

探索AI图像安全,助力可信AI发展

探索AI图像安全,助力可信AI发展0.前言1.人工智能发展与安全挑战1.1人工智能及其发展1.2人工智能安全挑战2.WAIC2023多模态基础大模型的可信AI2.1WAIC2023专题论坛2.2走进合合信息3.AI图像安全3.1图像篡改检测3.2生成式图像鉴别3.3OCR对抗攻击技术4.可信AI技术标准小结相关链接0.

具体项目下解决Echarts多端同步开发和维护的问题

具体问题场景PC端和移动端需要同时上线图表功能(没有多余工时)之后的版本迭代(功能、样式、配置等)默认双端同步,开发人员只希望维护一套代码Echarts在移动端有部分功能不兼容不支持Echarts在移动端的坑①移动端页面使用echarts4中的地图组件,并添加省份的点击事件,响应click无效,eharts也不支持ta

在Ubuntu 系统下开发GUI,用哪种开发工具比较好?

在Ubuntu系统下开发GUI,你可以考虑使用以下几种开发工具:QtCreator:QtCreator是一个跨平台的集成开发环境,专门用于开发基于Qt框架的应用程序。它提供了丰富的图形界面设计工具和代码编辑器,支持C++和QML编程。QtCreator具有良好的跨平台支持和强大的功能,适用于开发各种类型的GUI应用程序

热文推荐