亚马逊AWS官方博客

在 Amazon DocumentDB(兼容 MongoDB)中使用 $dateFromString 和 executionStats

Original URL: https://aws.amazon.com/blogs/database/using-datefromstring-and-executionstats-in-amazon-documentdb-with-mongodb-compatibility/

 

Amazon DocumentDB(兼容 MongoDB)是一款快速、可扩展、高度可用且完全托管的文档数据库服务,它支持 MongoDB 工作负载。借助 Amazon DocumentDB 可以轻松、直观地存储、查询 JSON 数据和建立索引。如果您还不熟悉 Amazon DocumentDB,请参阅 Ramping up on Amazon DocumentDB (with MongoDB compatibility)

Amazon DocumentDB 不断提高与 MongoDB 的兼容性。在撰写本文之时,Amazon DocumentDB 已经增加了对两项新功能的支持:

  • $dateFromString, 这是一个聚合管道运算符,借助它可以执行强大的文档聚合操作
  • 适用于explain()executionStats模式,它为查询计划中的每个阶段都提供详细的自行统计数据。

有关支持的 MongoDB API 和适用于 Amazon DocumentDB 的聚合管道功能的更多信息,请参阅支持的 MongoDB API、操作和数据类型

本文介绍了$dateFromStringexecutionStats的使用案例,并通过示例代码演示了如何使用这些新功能。

$dateFromString

借助$dateFromString聚合运算符可以将字符串格式的日期转换为DATE数据类型。$dateFromString$dateToString的逆运算。

为了帮助理解$dateFromString的工作原理,本文使用了一个示例数据集,其中记录了一个视频游戏中事件的发生日期和时间。尽管该视频游戏以字符串的方式记录事件日志,您的应用程序必须能以DATE数据类型来分析事件字段。为了将字符串转换为日期,您需要使用$dateToString聚合运算符。

以下示例数据集中的每个文档都记录了视频游戏中所出现的一个不同事件以及该事件发生的时间:

db.missionLog243.insertMany([
{ _id: 1, "event":"missionStart", logDate: "2020-03-15T13:41:33"},
{ _id: 2, "event":"jumpPoint1", logDate: "2020-03-15T13:45:34"},
{ _id: 3, "event":"jumpPoint2", logDate: "2020-03-15T13:48:21"},
{ _id: 4, "event":"jumpPoint3", logDate: "2020-03-15T13:52:09"},
{ _id: 5, "event":"missionEnd", logDate: "2020-03-15T13:58:44"}
])

下面的聚合查询以原生的字符串类型投射事件字段,然后将logDate字段转换为DATE数据类型,以便聚合管道中的后续阶段可以使用:

db.missionLog243.aggregate( [ {
   $project: {
      event: '$event',
      logDate: {
         $dateFromString: {
            dateString: '$logDate'
         }
      }
   }
} 
])

下面的输出为执行结果:

{ "_id" : 1, "event" : "missionStart", "logDate" : ISODate("2020-03-15T13:41:33Z") }
{ "_id" : 2, "event" : "jumpPoint1", "logDate" : ISODate("2020-03-15T13:45:34Z") }
{ "_id" : 3, "event" : "jumpPoint2", "logDate" : ISODate("2020-03-15T13:48:21Z") }
{ "_id" : 4, "event" : "jumpPoint3", "logDate" : ISODate("2020-03-15T13:52:09Z") }
{ "_id" : 5, "event" : "missionEnd", "logDate" : ISODate("2020-03-15T13:58:44Z") }

前面输出中的logDate 字段以DATE数据类型再现。

executionStats

当您调查查询的运行速度低于预期时,您应能理解所选查询计划的执行统计数据。explain命令的executionStats选项提供了特定阶段返回的文档数量(nReturned)以及执行各个阶段花费的时间(executionTimeMillisEstimate)executionStats的输出有利于识别查询中运行时间最长的阶段,以便您可以优化查询,进而提高应用程序的性能。

使用下面的命令,运行您希望在explain命令下改进的查询:

db.col.find({<em>&lt;query document&gt;</em>}).explain("executionStats");

下面的命令是一个示例运算:

db.fish.find({}).limit(2).explain("executionStats");

此运算的输出可能与以下类似:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "test.fish",
		"winningPlan" : {
			"stage" : "SUBSCAN",
			"inputStage" : {
				"stage" : "LIMIT_SKIP",
				"inputStage" : {
					"stage" : "COLLSCAN"
				}
			}
		}
	},
	"executionStats" : {
		"executionSuccess" : true,
		"executionTimeMillis" : "0.063",
		"planningTimeMillis" : "0.040",
		"executionStages" : {
			"stage" : "SUBSCAN",
			"nReturned" : "2",
			"executionTimeMillisEstimate" : "0.012",
			"inputStage" : {
				"stage" : "LIMIT_SKIP",
				"nReturned" : "2",
				"executionTimeMillisEstimate" : "0.005",
				"inputStage" : {
					"stage" : "COLLSCAN",
					"nReturned" : "2",
					"executionTimeMillisEstimate" : "0.005"
				}
			}
		}
	},
	"serverInfo" : {
		"host" : "enginedemo",
		"port" : 27017,
		"version" : "3.6.0"
	},
	"ok" : 1
}

要在前面的查询中仅显示executionStats,请输入以下命令:

db.fish.find({}).limit(2).explain("executionStats").executionStats;

有关查询性能问题排查和优化的更多信息,请参阅 Amazon DocumentDB 问题排查和 Amazon DocumentDB 的最佳实践

小结

AWS 始终为客户设身处地考虑,持续构建客户需要的功能。本文介绍了如何使用$dateFromString聚合运算符和executionStats来帮助构建和优化应用程序。

有关更多信息,请参阅 Amazon DocumentDB 入门或观看 YouTube 视频 Amazon DocumentDB 入门。您可以使用您目前用于 MongoDB 的相同应用程序代码、驱动程序和工具,开始针对 Amazon DocumentDB 进行开发。有关迁移到 Amazon DocumentDB 的更多信息,请参阅迁移到 Amazon DocumentDB 和 YouTube 视频 AWS re:Invent 2019: Migrating your databases to Amazon DocumentDB

本篇作者

Jeff Barr

Jeff Barr 是 AWS 的首席宣传官。他于 2004 年创办本博客,此后几乎未间断地撰写文章。