แปลง Timestamp เป็น Day of Month ใน MongoDB Aggregation
บทความนี้สาธิตวิธีการแปลงค่าตัวเลข (Unix Timestamp) ให้เป็น Date Object แล้วดึงค่า Day of Month (วันที่ของเดือน) ในขั้นตอน $project ของ Aggregation Pipeline
ขั้นตอนที่ 1: สร้าง Collection และเพิ่มข้อมูลตัวอย่าง
สร้าง collection ชื่อ demo209 มีฟิลด์ details เป็นอาร์เรย์ ที่แต่ละรายการมี dat (Unix timestamp) และ Name
> db.demo209.insertOne({
"_id": "101",
"details": [
{ "dat": 1528929908, "Name": "Chris" },
{ "dat": 1529082069, "Name": "Carol" }
],
"Age": 25,
"CountryName": "US"
});
{ "acknowledged": true, "insertedId": "101" }
ขั้นตอนที่ 2: แสดงข้อมูลทั้งหมด
> db.demo209.find().pretty();
ผลลัพธ์:
{ "_id": "101", "details": [
{ "dat": 1528929908, "Name": "Chris" },
{ "dat": 1529082069, "Name": "Carol" }
], "Age": 25, "CountryName": "US" }
ขั้นตอนที่ 3: Aggregation Pipeline แปลงและดึง Day of Month
1. $unwind: "$details" - แยกอาร์เรย์
2. $project - สร้างฟิลด์ใหม่ DayOfMonth โดย:
- คูณ details.dat ด้วย 1000 (แปลงวินาทีเป็นมิลลิวินาที)
- บวกกับ new Date(0) (Epoch) ผ่าน $add
- ใช้ $dayOfMonth ดึงวันที่
> db.demo209.aggregate({
"$unwind": "$details"
}, {
"$project": {
"Age": 1,
"CountryName": 1,
"Name": "$details.Name",
"DayOfMonth": {
"$dayOfMonth": {
"$add": [
new Date(0),
{ "$multiply": ["$details.dat", 1000] }
]
}
}
}
})
ผลลัพธ์ที่ได้
{ "_id": "101", "Age": 25, "CountryName": "US", "Name": "Chris", "DayOfMonth": 13 }
{ "_id": "101", "Age": 25, "CountryName": "US", "Name": "Carol", "DayOfMonth": 15 }
สรุป: MongoDB Aggregation รองรับ Operator ต่างๆ สำหรับจัดการ Date เช่น $dayOfMonth, $month, $year ซึ่งสามารถนำไปใช้กับ Timestamp ที่เก็บเป็นตัวเลขได้โดยการแปลงก่อนด้วย $add และ $multiply