Amazon Web Services ブログ

Amazon DocumentDB (MongoDB 互換) で $dateFromString と executionStats を使用する

Amazon DocumentDB (MongoDB 互換) は、MongoDB のワークロードをサポートする高速でスケーラブル、かつ可用性に優れた完全マネージドのドキュメントデータベースサービスです。Amazon DocumentDB では、JSON データの保存、クエリ、およびインデックスの作成を簡単かつ直感的に行うことができます。Amazon DocumentDB を初めて使用する場合は、「Amazon DocumentDB (MongoDB 互換) でのランプアップ」をご覧ください。

Amazon DocumentDB では、MongoDB との互換性の改善を続けています。このブログを執筆している時点で、Amazon DocumentDB には 2 つの新機能を新たにサポートしています。

  • $dateFromString は、ドキュメントに対して強力な集計を作成できる集計パイプライン演算子です
  • executionStats モード (explain() 用) は、クエリプラン内の各ステージの詳細な実行統計を提供します。

Amazon DocumentDB のサポートされている MongoDB API と集計パイプライン機能の詳細については、「サポートされている 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"}
])

次の集計クエリは、イベントフィールドをネイティブの String 型で出力し、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

クエリの実行が予想よりも遅い理由を調査する際は、選択したクエリプランの実行統計を理解する必要があります。executionStats オプション (explain コマンドの) は、特定のステージ (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 で「Getting Started with Amazon DocumentDB」の動画をご覧ください。現在 MongoDB で使用しているものと同じアプリケーションコード、ドライバ、およびツールを使って、Amazon DocumentDB での開発を開始できます。Amazon DocumentDBへの移行の詳細については、「Amazon DocumentDB への移行」、および YouTube で「AWS re:Invent 2019: Migrating your databases to Amazon DocumentDB」の動画をご覧ください。

 


著者について

 

Joseph Idziorek は、アマゾン ウェブ サービスのプリンシパルプロダクトマネージャーです。