日付の操作
Mongoose スキーマで Date
型のパスを宣言する方法は次のとおりです。
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
name: String,
// `lastActiveAt` is a date
lastActiveAt: Date
});
const User = mongoose.model('User', userSchema);
ユーザー ドキュメント を作成すると、Mongoose はその値を ネイティブ JavaScript 日付 にキャストし、Date()
コンストラクタ を使用します。
const user = new User({
name: 'Jean-Luc Picard',
lastActiveAt: '2002-12-09'
});
user.lastActiveAt instanceof Date; // true
無効な日付は ドキュメントの検証 時に CastError
を発生させます。
const user = new User({
name: 'Jean-Luc Picard',
lastActiveAt: 'not a date'
});
user.lastActiveAt instanceof Date; // false
user.validateSync().errors['lastActiveAt']; // CastError
バリデーター
日付には min
と max
の2つの組み込みバリデーターがあります。これらのバリデーターは、指定された日付が min
より厳密に小さいか max
より厳密に大きい場合に ValidatorError
を報告します。
const episodeSchema = new mongoose.Schema({
title: String,
airedAt: {
type: Date,
// The dates of the first and last episodes of
// Star Trek: The Next Generation
min: '1987-09-28',
max: '1994-05-23'
}
});
const Episode = mongoose.model('Episode', episodeSchema);
const ok = new Episode({
title: 'Encounter at Farpoint',
airedAt: '1987-09-28'
});
ok.validateSync(); // No error
const bad = new Episode({
title: 'What You Leave Behind',
airedAt: '1999-06-02'
});
bad.airedAt; // "1999-06-02T00:00:00.000Z"
// Path `airedAt` (Tue Jun 01 1999 20:00:00 GMT-0400 (EDT)) is after
// maximum allowed value (Sun May 22 1994 20:00:00 GMT-0400 (EDT)).
bad.validateSync();
クエリ
MongoDB は、日付の範囲によるクエリと日付によるソートをサポートしています。日付、日付範囲、日付によるソートによるクエリの例を次に示します。
// Find episodes that aired on this exact date
return Episode.find({ airedAt: new Date('1987-10-26') }).
then(episodes => {
episodes[0].title; // "Where No One Has Gone Before"
// Find episodes within a range of dates, sorted by date ascending
return Episode.
find({ airedAt: { $gte: '1987-10-19', $lte: '1987-10-26' } }).
sort({ airedAt: 1 });
}).
then(episodes => {
episodes[0].title; // "The Last Outpost"
episodes[1].title; // "Where No One Has Gone Before"
});
端数のキャスト
日付のキャストには、JavaScript のネイティブ日付の解析と異なる点がいくつかあります。まず、Mongoose は指定されたオブジェクトで valueOf()
関数 を検索し、日付をキャストする前に valueOf()
を呼び出します。つまり、Mongoose は モーメントオブジェクト を自動的に日付にキャストできます。
const moment = require('moment');
const user = new User({
name: 'Jean-Luc Picard',
lastActiveAt: moment.utc('2002-12-09')
});
user.lastActiveAt; // "2002-12-09T00:00:00.000Z"
デフォルトでは、数値文字列を Date コンストラクタに渡すと、JavaScript はそれを年に変換しようとします。
new Date(1552261496289); // "2019-03-10T23:44:56.289Z"
new Date('1552261496289'); // "Invalid Date"
new Date('2010'); // 2010-01-01T00:00:00.000Z
Mongoose は、JavaScript で表現可能な日付の範囲 外の数値を含む数値文字列を変換し、日付コンストラクタに渡す前に数値に変換できます。
[require: Date Tutorial.*Example 1.4.3]
タイムゾーン
MongoDB は日付を 64 ビット整数として格納します。つまり、Mongoose はデフォルトでタイムゾーン情報を格納しません。Date#toString()
を呼び出すと、JavaScript ランタイムは OS のタイムゾーン を使用します。