sql >> データベース >  >> NoSQL >> MongoDB

MongoDB $ dateFromString

    MongoDBでは、$dateFromString 集計パイプライン演算子は、日付/時刻文字列を日付オブジェクトに変換します。

    fooというコレクションがあるとします。 次のドキュメントを使用:

    { "_id" : 1, "bar" : "2020-12-31T23:30:25.123" }
    { "_id" : 2, "bar" : "2020-12-31" }
    { "_id" : 3, "bar" : "2020-12-31T23:30" }

    すべてのドキュメントには日付/時刻の文字列が含まれています。

    次のコードを実行して、barから日付オブジェクトを返すことができます。 それらのドキュメントのフィールド。

    db.foo.aggregate([ 
      {
        $project: {
            date: {
              $dateFromString: {
                  dateString: '$bar'
              }
            }
        }
      } 
    ])

    結果:

    { "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
    { "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") }
    { "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") }

    すべての日付/時刻文字列が日付オブジェクトに変換されました。

    フィールド名もbarから変更しました date

    フォーマットを指定する

    オプションのformatを提供できます 提供される日付/時刻文字列の形式を指定する引数。フォーマット指定は、0個以上のフォーマット指定子を含む任意の文字列リテラルにすることができます。

    format パラメータはMongoDBバージョン4.0から利用できます。

    デフォルトの形式は%Y-%m-%dT%H:%M:%S.%LZです。 、これは前の例で使用されているものです。

    次のドキュメントをコレクションに挿入するとします。

    { "_id" : 4, "bar" : "07/08/2020" }

    この場合、使用されているロケールに応じて、日付は8か月目の7日、または7か月目の8日になる可能性があります。

    フォーマット仕様を使用して、どのフォーマットを指定するかを正確に指定できます。

    例:

    db.foo.aggregate([ 
      { $match: { _id: 4 } },
      {
        $project: {
            date: {
              $dateFromString: {
                  dateString: '$bar',
                  format: "%m/%d/%Y"
              }
            }
        }
      } 
    ])

    結果:

    { "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }

    この場合、7か月目の8日目と指定しました。

    ここでもまたですが、今回は日と月を入れ替えます。

    db.foo.aggregate([ 
      { $match: { _id: 4 } },
      {
        $project: {
            date: {
              $dateFromString: {
                  dateString: '$bar',
                  format: "%d/%m/%Y"
              }
            }
        }
      } 
    ])

    結果:

    { "_id" : 4, "date" : ISODate("2020-08-07T00:00:00Z") }

    今回は、8か月目の7日目と解釈されます。

    MongoDB $dateFromStringを参照してください 有効なフォーマット指定子のリストについては、フォーマット指定子。

    ISO週の日付形式

    ISO8601形式を使用して日付を指定できる形式指定子がいくつかあります。

    特に、次を使用できます:

    フォーマット指定子 出力
    %G ISO8601形式の年
    %u ISO 8601形式の曜日番号(1-月曜日、7-日曜日)
    %V ISO8601形式の年の週

    次のようなドキュメントがあるとします。

    { "_id" : 5, "bar" : "7-8-2020" }

    その日付は、ISO週の7日目、その年の8番目のISO週、そしてその年であると解釈できます。

    このように:

    db.foo.aggregate([ 
      { $match: { _id: 5 } },
      {
        $project: {
            date: {
              $dateFromString: {
                  dateString: '$bar',
                  format: "%u-%V-%G"
              }
            }
        }
      } 
    ])

    結果:

    { "_id" : 5, "date" : ISODate("2020-02-23T00:00:00Z") }

    タイムゾーンを指定する

    $dateFromStringで使用するタイムゾーンを指定できます オペレーター。

    タイムゾーンは、Olsonタイムゾーン識別子(例:"Europe/London")を使用して指定できます。 、"GMT" )またはUTCオフセット(例:"+02:30""-1030"

    オルソンタイムゾーン識別子

    次に、それぞれがOlsonタイムゾーンIDを使用する3つの異なるタイムゾーンで日付文字列を出力する例を示します。

    db.foo.aggregate([ 
      { $match: { _id: 1 } },
      {
        $project: {
            utc: {
              $dateFromString: {
                  dateString: '$bar',
                  timezone: "UTC"
              }
            },
            honolulu: {
              $dateFromString: {
                  dateString: '$bar',
                  timezone: "Pacific/Honolulu"
              }
            },
            auckland: {
              $dateFromString: {
                  dateString: '$bar',
                  timezone: "Pacific/Auckland"
              }
            }
        }
      } 
    ]).pretty()

    結果:

    {
    	"_id" : 1,
    	"utc" : ISODate("2020-12-31T23:30:25.123Z"),
    	"honolulu" : ISODate("2021-01-01T09:30:25.123Z"),
    	"auckland" : ISODate("2020-12-31T10:30:25.123Z")
    }

    UTCオフセット

    UTCオフセットを使用する例を次に示します。

    db.foo.aggregate([ 
      { $match: { _id: 1 } },
      {
        $project: {
            "date+00:00": {
              $dateFromString: {
                  dateString: '$bar',
                  timezone: "+00:00"
              }
            },
            "date-10:00": {
              $dateFromString: {
                  dateString: '$bar',
                  timezone: "-10:00"
              }
            },
            "date+12:00": {
              $dateFromString: {
                  dateString: '$bar',
                  timezone: "+12:00"
              }
            }
        }
      } 
    ]).pretty()

    結果:

    {
    	"_id" : 1,
    	"date+00:00" : ISODate("2020-12-31T23:30:25.123Z"),
    	"date-10:00" : ISODate("2021-01-01T09:30:25.123Z"),
    	"date+12:00" : ISODate("2020-12-31T11:30:25.123Z")
    }

    timezoneを使用する場合 パラメータの場合、日付文字列にZを追加してズールー時間(UTCタイムゾーン)を示すことはできません。たとえば、日付文字列を2020-12-31T23:30:25.123Zにすることはできません。 タイムゾーンパラメータを使用する場合。

    また、タイムゾーンパラメータを使用するときは、日付文字列にタイムゾーン情報を含めないでください。

    onNull パラメータ

    onNull パラメータを使用して、日付がnullまたは存在しない場合に何を返すかを指定できます。

    onNullに提供される値 パラメータは任意の有効な式にすることができます。

    次のようなドキュメントがあるとします。

    { "_id" : 6, "bar" : null }

    onNullを使用できます 次のように:

    db.foo.aggregate([ 
      { $match: { _id: 6 } },
      {
        $project: {
            date: {
              $dateFromString: {
                  dateString: '$bar',
                  onNull: "No valid date was supplied"
              }
            }
        }
      } 
    ])

    結果:

    { "_id" : 6, "date" : "No valid date was supplied" }

    この場合、日付はnullでした したがって、出力ドキュメントには、onNullに指定した文字列が含まれます。 パラメータ。

    onError パラメータ

    オプションでonErrorを使用できます エラーが発生した場合に出力する式を提供するパラメーター。

    コレクションに次のドキュメントが含まれているとします。

    { "_id" : 7, "bar" : "21st Dec, 2030" }

    barに日付がありますが フィールドの場合、これは有効な日付/時刻文字列ではないため、dateFromStringを使用するとエラーが発生します 日付オブジェクトに変換しようとします。

    エラーの例:

    db.foo.aggregate([ 
      { $match: { _id: 7 } },
      {
        $project: {
            date: {
              $dateFromString: {
                  dateString: '$bar'
              }
            }
        }
      } 
    ])

    結果:

    Error: command failed: {
    	"ok" : 0,
    	"errmsg" : "an incomplete date/time string has been found, with elements missing: \"21st Dec, 2030\"",
    	"code" : 241,
    	"codeName" : "ConversionFailure"
    } : aggregate failed :
    [email protected]/mongo/shell/utils.js:25:13
    [email protected]/mongo/shell/assert.js:18:14
    [email protected]/mongo/shell/assert.js:618:17
    [email protected]/mongo/shell/assert.js:708:16
    [email protected]/mongo/shell/db.js:266:5
    [email protected]/mongo/shell/collection.js:1046:12
    @(shell):1:1

    それは厄介な見た目のエラーです。

    onErrorを使用できます 見栄えを良くするためのパラメータ:

    db.foo.aggregate([ 
      { $match: { _id: 7 } },
      {
        $project: {
            date: {
              $dateFromString: {
                  dateString: '$bar',
                  onError: "An error occurred while parsing the date string"
              }
            }
        }
      } 
    ])

    結果:

    { "_id" : 7, "date" : "An error occurred while parsing the date string" }

    onNullとして表示 およびonError パラメータを使用すると、実際のドキュメントを返すことができ、1つの不正なドキュメントが操作全体を停止することを心配することなく、複数のドキュメントを返すことができます。

    例:

    db.foo.aggregate([ 
      {
        $project: {
            date: {
              $dateFromString: {
                  dateString: '$bar',
                  onNull: "The date was either empty or null",
                  onError: "An error occurred while parsing the date string"
              }
            }
        }
      } 
    ])

    結果:

    { "_id" : 1, "date" : ISODate("2020-12-31T23:30:25.123Z") }
    { "_id" : 2, "date" : ISODate("2020-12-31T00:00:00Z") }
    { "_id" : 3, "date" : ISODate("2020-12-31T23:30:00Z") }
    { "_id" : 4, "date" : ISODate("2020-07-08T00:00:00Z") }
    { "_id" : 5, "date" : ISODate("2020-08-07T00:00:00Z") }
    { "_id" : 6, "date" : "The date was either empty or null" }
    { "_id" : 7, "date" : "An error occurred while parsing the date string" }


    1. MongoDBでテキストインデックスを作成する方法

    2. マングースの接続を手動で閉じる必要がありますか?

    3. show dbsは、コマンドエラーの実行を許可されていません

    4. ホストマシンからDockerコンテナで実行されているRedisに接続する