次のクエリでドキュメントを挿入しています:
db.collection.insert(
{
date: Date('Dec 12, 2014 14:12:00')
})
しかし、それは私にエラーを与えます。
エラーなしでコレクションに日付を挿入するにはどうすればよいですか?
上記のコードはDate()
メソッドがオブジェクトに指定された引数に関係なく現在の日付を文字列として返すため、別のエラーが発生する必要があります。 documentation から:JavaScript Dateオブジェクトは、コンストラクターとしてJavaScript Date
を呼び出すことによってのみインスタンス化できます。通常の関数として呼び出す(つまり、 new
演算子)は、Date
オブジェクトではなく文字列を返します。他のJavaScriptオブジェクトタイプとは異なり、JavaScript Dateオブジェクトにはリテラル構文がありません。
JavaScriptのDateコンストラクターの月パラメーターが0ベースであることを念頭に置いて、正しい日付を取得する代わりにこれを試してみるとよいでしょう。
var myDate = new Date(2014, 11, 12, 14, 12);
db.collection.insert({ "date": myDate });
JavaScriptの日付オブジェクトはおかしなことがあります。実際に引数を指定してインスタンス化する方法に応じて、異なる結果が得られます。
たとえば、これを試すことを提案する人もいます:
var myDate = new Date(2014, 11, 12, 14, 12)
これは問題ないようですが、問題があります。
JavaScriptでDate
オブジェクトをインスタンス化するいくつかの形式は、日付を作成するときに「ローカル」タイムゾーンを使用することがわかります。その他の場合は、UTCまたは「ユニバーサル」タイムゾーンを使用して、設定された標準に準拠します。これは、MongoDBが期待する「標準」でもあり、アプリケーションがこの方法で日付を格納するためのベストプラクティスとして一般に受け入れられています。データストアから離れて、コードで変換を行います。これにより、問題なく複数のロケールを処理できるようになります。
だからあなたがやるべきことはこれです:
var date = new Date("2014-12-11T14:12:00Z")
MongoDBシェルにも「ヘルパー」があり、これをほぼ同じ方法で処理しますが、構文に固有です。
var date = new ISODate("2014-12-11T14:12:00Z")
これにより、予想どおりに正しく格納されるUTC Date値が生成されます。 MongoDBに日付を保存するときは、常にUTCを扱う必要があります。