MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBの「文字列型から日付型への変換に失敗しました」エラーを解決する方法

MongoDBで文字列として保存された日付データを扱う際、「文字列型から日付型への変換に失敗しました」というエラーに遭遇することがあります。この問題を解決するには、aggregate()パイプライン内で$dateFromString演算子を使用します。$dateFromStringは、日付・時刻形式の文字列をDateオブジェクトに変換してくれる便利な演算子です。

サンプルコレクションの作成

まずは、日付文字列を含むドキュメントを持つコレクションを作成してみましょう。

> db.demo619.insertOne({"DueDate":"10-10-2020"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e99d7846c954c74be91e69e")
}
> db.demo619.insertOne({"DueDate":"12-01-2019"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e99d7996c954c74be91e69f")
}
> db.demo619.insertOne({"DueDate":"28-10-2010"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e99d7ab6c954c74be91e6a0")
}

登録済みドキュメントの確認

find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。

> db.demo619.find();

実行すると、以下のような出力が得られます。この時点ではDueDateフィールドはまだ文字列型です。

{ "_id" : ObjectId("5e99d7846c954c74be91e69e"), "DueDate" : "10-10-2020" }
{ "_id" : ObjectId("5e99d7996c954c74be91e69f"), "DueDate" : "12-01-2019" }
{ "_id" : ObjectId("5e99d7ab6c954c74be91e6a0"), "DueDate" : "28-10-2010" }

$dateFromStringで文字列をDateオブジェクトに変換する

それでは、文字列型の日付をDateオブジェクトに変換するクエリを見ていきましょう。aggregate()の中で$projectステージと組み合わせて使用します。

> db.demo619.aggregate( [ {
...    $project: {
...       DueDate: {
...          $dateFromString: {
...             dateString: '$DueDate',
...             timezone: 'America/New_York'
...          }
...       }
...    }
... } ] )

変換結果の確認

上記のクエリを実行すると、以下のように文字列がISODate形式のDateオブジェクトに変換されていることが確認できます。

{ "_id" : ObjectId("5e99d7846c954c74be91e69e"), "DueDate" : ISODate("2020-10-10T04:00:00Z") }
{ "_id" : ObjectId("5e99d7996c954c74be91e69f"), "DueDate" : ISODate("2019-01-12T05:00:00Z") }
{ "_id" : ObjectId("5e99d7ab6c954c74be91e6a0"), "DueDate" : ISODate("2010-10-28T04:00:00Z") }

ポイント解説

timezoneパラメータでは、日付文字列を解釈する際のタイムゾーンを指定できます。上の例では「America/New_York」を指定しているため、UTC時刻に換算された結果が出力されています。日本時間で扱いたい場合は「Asia/Tokyo」を指定してください。

また、変換できない不正な形式の文字列が含まれている可能性がある場合は、onErrorパラメータを併用すると、エラーで処理全体が中断されるのを防げます。例えば「onError: null」と指定すれば、変換に失敗したドキュメントにはnullが設定されます。

このように$dateFromStringを活用することで、文字列型の日付データを安全にDateオブジェクトへ変換でき、「変換に失敗しました」エラーを効果的に回避できます。

  1. MySQLで文字列から日付を抽出する方法|SUBSTRING_INDEX関数の実践的な使い方

    MySQLで文字列から日付を抽出するには?MySQLで文字列の中から日付部分だけを取り出したい場合、SUBSTRING_INDEX() 関数を使うのが便利です。この関数は、指定した区切り文字を基準に文字列を分割し、必要な部分を取得できます。ここでは、実際にテーブルを作成し、文章の中に含まれる日付(例:12/31/2018)を抽出する手順を解説します。1. サンプルテーブルを作成するまず、文字列を格納するためのテーブルを作成します。mysql> create table DemoTable -> ( -> Title text -> );Query OK

  2. 【Java入門】文字列をDate型に変換する方法をわかりやすく解説

    はじめにJavaでは、SimpleDateFormatクラスを使うことで、文字列形式の日付データをDateオブジェクトへ簡単に変換できます。本記事では、具体的なサンプルコードとともに、その基本の手順をわかりやすく解説します。変換元の文字列を用意するまず、以下のように日付を表す文字列を用意します。String date1 = 11/10/2018; String date2 = 15-Mar-2019 21:11:35;文字列から日付への変換手順SimpleDateFormatのコンストラクタには、元の文字列の書式に対応したパターンを指定します。その後、parse()メソッドを呼び出すことで、文