การ Insert วันที่ (Date) ใน MongoDB ผ่าน Mongo Shell
ใน Mongo Shell สามารถสร้าง Date object ด้วย JavaScript Date constructor แล้ว insert ลงในเอกสารได้
ไวยากรณ์
var yourVariableName = new Date(year, month, day, hour, minute);
db.yourCollectionName.insertOne({yourDateFieldName: yourVariableName});
หมายเหตุ: พารามิเตอร์ month เริ่มจาก 0 (January = 0, December = 11)
ตัวอย่างการสร้าง Date Variable
> var creatingDate = new Date(2019, 03, 29, 13, 12);
สร้างวันที่ 29 เมษายน 2019 เวลา 13:12 (เดือน 03 = เมษายน)
Insert เอกสารพร้อม Date Variable
> db.insertingDateUsingVariableDemo.insertOne({
"UserName": "John",
"UserMessages": ["Hi", "Hello", "Awesome"],
"UserPostDate": creatingDate
});
แสดงข้อมูล
> db.insertingDateUsingVariableDemo.find().pretty();
ผลลัพธ์ (จัดเก็บเป็น ISODate):
{
"_id" : ObjectId("5c9d1b19a629b87623db1b21"),
"UserName" : "John",
"UserMessages" : [ "Hi", "Hello", "Awesome" ],
"UserPostDate" : ISODate("2019-04-29T07:42:00Z")
}
รูปแบบ Date อื่นๆ ที่ใช้ได้
1. ISODate String (แนะนำ)
> db.collection.insertOne({
dateField: new ISODate("2019-04-29T13:12:00Z")
});
// หรือ
> db.collection.insertOne({
dateField: ISODate("2019-04-29T13:12:00Z")
});
2. new Date() โดยไม่มีพารามิเตอร์ (วันเวลาปัจจุบัน)
> db.collection.insertOne({
createdAt: new Date()
});
3. Date String Parsing
> db.collection.insertOne({
dateField: new Date("2019-04-29")
});
> db.collection.insertOne({
dateField: new Date("2019-04-29T13:12:00Z")
});
4. Timestamp (MongoDB Internal)
> db.collection.insertOne({
timestampField: new Timestamp()
});
การจัดการ Timezone
- MongoDB จัดเก็บ Date ทั้งหมดในรูปแบบ UTC (ISODate)
- การแสดงผลใน Shell จะแสดงเป็น UTC (มี Z ต่อท้าย)
- Application ควรจัดการ Timezone เองที่ Layer Application
ตัวอย่างการ Query วันที่
// วันที่เท่ากับ
db.collection.find({ dateField: ISODate("2019-04-29") });
// ช่วงวันที่
db.collection.find({
dateField: {
$gte: ISODate("2019-04-01"),
$lt: ISODate("2019-05-01")
}
});
// ใช้ Date object
var start = new Date(2019, 3, 1); // 1 เมษายน
var end = new Date(2019, 4, 1); // 1 พฤษภาคม
db.collection.find({ dateField: { $gte: start, $lt: end } });
Best Practices
- ใช้ ISODate() หรือ new Date(ISOString) เพื่อความชัดเจน
- หลีกเลี่ยง new Date(year, month, day) เพราะ month เริ่มจาก 0 งงง่าย
- เก็บวันที่เป็น UTC เสมอ
- ใช้ Date object ไม่ใช่ String สำหรับการ Query และ Index