วิธีการ Insert Date ใน MongoDB ให้ถูกต้อง
MongoDB เก็บวันที่ในรูปแบบ BSON Date (64-bit integer มิลลิวินาทีจาก Unix Epoch) ใช้ ISODate() หรือ new Date() ในการสร้างค่าวันที่
ตัวอย่างการ Insert Date แบบต่างๆ
> // วันที่/เวลาปัจจุบัน
> db.demo421.insert({ "DueDate": new Date(Date.now()) });
> // วันที่เฉพาะ (UTC)
> db.demo421.insert({ "DueDate": new Date("2020-01-15") });
> // วันที่เวลาเฉพาะ (ISO String)
> db.demo421.insert({ "DueDate": new Date("2018-12-31") });
แสดงข้อมูลที่ Insert
> db.demo421.find();
ผลลัพธ์:
{ "_id": ObjectId("..."), "DueDate": ISODate("2020-03-19T16:50:52.746Z") }
{ "_id": ObjectId("..."), "DueDate": ISODate("2020-01-15T00:00:00Z") }
{ "_id": ObjectId("..."), "DueDate": ISODate("2018-12-31T00:00:00Z") }
รูปแบบการสร้าง Date ใน MongoDB Shell
| รูปแบบ | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| new Date() | เวลาปัจจุบัน (Local Time) | new Date() |
| new Date(milliseconds) | จาก Unix Timestamp (ms) | new Date(1578960000000) |
| new Date(dateString) | Parse ISO 8601 String | new Date("2020-01-15") |
| ISODate() | Alias ของ new Date() (แนะนำ) | ISODate("2020-01-15") |
ข้อสังเกตสำคัญ
- MongoDB เก็บวันที่เป็น UTC เสมอ (Zulu time - ตัว Z ท้าย)
- Date String ไม่มี Timezone -> ถือเป็น UTC
- Date String มี Timezone -> แปลงเป็น UTC ก่อนเก็บ
- ใน Application ให้ใช้ Date Object ของภาษานั้น (DateTime, datetime, Date ฯลฯ) ไดรเวอร์จะแปลงให้อัตโนมัติ
การ Query วันที่
// มากกว่าวันที่
db.demo421.find({ DueDate: { $gt: ISODate("2020-01-01") } });
// ช่วงวันที่
db.demo421.find({ DueDate: { $gte: ISODate("2020-01-01"), $lt: ISODate("2020-02-01") } });
// ใช้ Date Object จากภาษาโปรแกรมได้เลย (Driver จะแปลง)
การ Format แสดงผล (ใน Aggregation)
> db.demo421.aggregate([
{ $project: { DueDate: 1, formatted: { $dateToString: { format: "%Y-%m-%d", date: "$DueDate" } } } }
]);