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

news/2024/7/7 18:45:56

在 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

http://lihuaxi.xjx100.cn/news/1554922.html

相关文章

计算机网络分类

按照覆盖范围分类 (1)个域网:通常覆盖范围在1~10m。 (2)局域网:通常覆盖范围在10m~1km。 (3)城域网:覆盖范围通常在5~50 km 。 &…

【Java 基础篇】Java 标准输出流详解:输出你的程序之美

Java 编程中,标准输出流是一个重要的概念。它允许我们将程序的输出信息显示在终端或控制台上,这对于调试、用户界面和与用户的交互非常重要。在这篇文章中,我们将深入探讨 Java 的标准输出流,了解如何使用它以及一些常见的用法和技…

数据库----数据查询

1.6 查询语句 语法:select [选项] 列名 [from 表名] [where 条件] [group by 分组] [order by 排序][having 条件] [limit 限制]1.6.1 字段表达式 mysql> select 锄禾日当午; ------------ | 锄禾日当午 | ------------ | 锄禾日当午 | ---…

3288S Android11 适配红外遥控功能(超详细)

目录 一、rk3288平台红外遥控介绍二、原理图分析三、配置设备树并使能红外遥控功能四、打开红外打印功能,查看红外遥控的用户码和键值五、将查看到的红外遥控用户码和键值添加到设备树和.kl文件六、Android红外遥控.kl文件映射知识和使用添加新的.kl文件七、补充&am…

async和await的用法

定义 async的定义 在mdn中,async的定义为: async function 关键字可用于定义表达式中的异步函数。 其实很简单,就是async关键字后面定义的函数会被转化为一个异步的函数 如下所示: function fn1(){return 同步}async function asyncFn(){return 异步}console.log(fn1())con…

苹果笔不用原装可以吗?好用的平板触控笔

由于Apple pencil的出世,给许多小伙伴带了很高的生产效率。但Apple pencil的昂贵,让许多小伙伴连连劝退,觉得只是偶尔写字,没有必要入手一支这么昂贵的笔,咱们国内也会很多做得相当不错的平替电容笔,但很多…

ElementPlus里的类型别名声明及使用

前言 最近刚开始使用ts,定义的变量总是不知道类型,特别是第三方库中,更是不知道有哪些类型,笨人本办法,遇到一个就记录一下,方便我下次使用查询 组件实例 我们通过组件的ref属性获取组件实例时,…

AI绘图提示词Stable Diffusion Prompt 笔记

基础 提示词分为正向提示词(positive prompt)和反向提示词(negative prompt),用来告诉AI哪些需要,哪些不需要词缀的权重默认值都是1,从左到右依次减弱,权重会影响画面生成结果。AI …