HOWTO · MongoDB

MongoDB で文字列を日付に変換する

この記事では、さまざまなバージョンの MongoDB で文字列を日付フィールドに変換する方法について説明します。

MongoDB は、ますます人気が高まっている優れたプラットフォームです。 MongoDB が提供するさまざまな機能の中で、データをあるタイプから別のタイプに変換することもできます。

これは複雑な機能のように思えるかもしれませんが、実行するのは非常に簡単です。

データを文字列から日付に変換する方法を探しているなら、あなたは正しい場所にいます。

文字列または日付データ型の作成

変換のしくみを詳しく説明する前に、まず、文字列と日付がどのように作成されるかを説明する必要があります。 理想的には、ユーザーは最初に目的のデータ型を選択します。

ただし、後で変更したい場合があるかもしれません。 いずれにせよ、最初に日付形式のフィールドを作成する方法をいくつか紹介します。

{
birth: new Date('Jun 23, 1912'),
}

したがって、一般的な構造は、フィールドの名前の後にコロンとデータ型が続きます。

MongoDB で文字列を日付に変換する

MongoDB では、データ型を文字列から日付に切り替えることができます。 それはあなたが予想するよりもはるかに簡単です。

数行のコードを追加するだけで、準備完了です。

toDate 演算子を使用する

複数の方法がある中で、toDate 演算子はおそらく最も頻繁に使用されるものです。 これは、覚えやすく実行しやすいためです。

この演算子は、可能であれば値を日付に変換します。

ただし、この形式に変更できない場合はエラーが返されます。 同様に、変換される値が null または欠落している場合、演算子は null を返します。

MongoDB のバージョンが MongoDB 4.0 よりも古い場合、この方法を使用できない可能性があることに注意してください。 MongoDB の toDate 演算子を使用する簡単な方法を次に示します。

db.collection.aggregate([
{ "$addFields": {
"created_at": {
"$toDate": "$created_at"
}
} }
])

このコードは、必要な日付形式で格納されているフィールドを変更します。 上記のように、エラーまたは欠落データがある場合、オペレーターはエラーまたは null 値を返します。

注: このコードは、集約されたパイプライン内で動作するように設計されています。 ただし、それなしで使用するように変更することはできます。

convert 演算子を使用する

文字列を日付に変換できるもう 1つの方法は、convert 演算子です。 これは、値を日付形式に変換する限り、toDate 演算子と同様に機能します。

convert 演算子は、多くの変換に使用されるため、異なります。

文字列から日付への変換に限定されません。 したがって、convert 演算子を使用する際は、データ型を定義して、値を変換する必要があります。

これは、convert 演算子を使用した後に to 演算子を使用して行われることがよくあります。 その使用法をよりよく理解するために、以下のコードを参照してください。

db.collection.aggregate([
{ "$addFields": {
"created_at": {
"$convert": {
"input": "$created_at",
"to": "date"
}
}
} }
])

このコードは、上記の toDate 演算子のコードと同じように機能します。 ご覧のとおり、convert 演算子を指定した後、to 演算子を使用して、値を日付形式に変換するように指定しています。

この演算子は、MongoDB 4.0 以降のバージョンでのみ使用できることに注意してください。

dateFromString 演算子を使用する

古いバージョンの MongoDB を使用している場合は、いつでも dateFromString 演算子を使用して作業を完了できます。 これは MongoDB 3.6 以降のすべてのバージョンで機能するため、このオペレーターを使用するには更新が必要になる場合があります。

dateFromString 演算子を使用すると、文字列を日付オブジェクトに変換できます。 さらに、日付形式やタイムゾーンを指定するオプションなど、いくつかの追加機能があります。

この演算子を使用する簡単な方法を次に示します。

db.collection.aggregate([
{ "$addFields": {
"created_at": {
"$dateFromString": {
"dateString": "$created_at",
"format": "%m-%d-%Y"/* this option is only available in MongoDB 4.0. or newer versions*/
}
}
} }
])

このコードにより、目的の変換を行うことができます。 さらに、適切なバージョンの MongoDB を使用している場合は、format 演算子を使用して日付形式を変更することもできます。

set 演算子を使用する

古いバージョンの MongoDB を使用したい場合でも、set 演算子を使用して目的の結果を得ることができます。 これは、MongoDB 2.6 と MongoDB 3.1 の間 (両方を含む) のすべてのバージョンの MongoDB で利用できます。

この演算子は、文字列を日付に変換するためだけに使用されるわけではないことに注意してください。 したがって、ジョブを完了するには、いくつかの手動プロセスを含める必要があります。

必要なものにアクセスするには、find() メソッドによって返されたカーソルを、forEach() メソッドまたは cursor メソッド next() を使用して反復処理する必要があります。 このループ内で目的のフィールドを ISODATE オブジェクトに変換する必要があります。

最後に、set 演算子を更新して、文字列形式を更新できるようにします。 以下のコードでは、xyz は文字列を含むフィールドで、日付形式に変換する必要があります。

var cursor = db.collection.find({"xyz": {"$exists": true, "$type": 2 }});
while (cursor.hasNext()) {
var doc = cursor.next();
db.collection.update(
{"_id" : doc._id},
{"$set" : {"xyz" : new ISODate(doc.xyz)}}
)
};

ClockTime を使用する

ほとんどの場合に機能する別の方法は、ClockTime を使用します。 これは基本的に ClockTime コレクションを find() メソッドと組み合わせて使用し、文字列を日付形式に変換します。

使用例を以下のコードに示します。

db.ClockTime.find().forEach(function(doc) {
doc.ClockInTime=new Date(doc.ClockInTime);
db.ClockTime.save(doc);
})

MongoDB で文字列を日付に変換する方法を見つけていただければ幸いです。