คุณสามารถ $sort
และใช้ $last
สำหรับรายการ โดยปัดเศษคีย์การจัดกลุ่มในแต่ละวัน:
db.collection.aggregate([
{ "$sort": { "timestamp": 1 } },
{ "$group": {
"_id": {
"$add": [
{ "$subtract": [
{ "$subtract": [ "$timestamp", new Date(0) ] },
{ "$mod": [
{ "$subtract": [ "$timestamp", new Date(0) ] },
1000 * 60 * 60 * 24
]}
]},
new Date(0)
]
},
"lastDoc": { "$last": "$$ROOT" }
}}
])
ดังนั้นการจัดเรียงจะทำให้สิ่งต่างๆ ปรากฏตามลำดับ จากนั้นกลุ่ม _id
จะถูกปัดเศษในแต่ละวันด้วยคณิตศาสตร์วันที่ คุณลบวันที่ยุคออกจากวันที่ปัจจุบันเพื่อให้เป็นตัวเลข ใช้โมดูลัสเพื่อปัดเศษเป็นวัน จากนั้นเพิ่มวันที่ยุคให้เป็นตัวเลขเพื่อส่งกลับ Date
เมื่อพิจารณาทางคณิตศาสตร์แล้ว เราได้ค่าการประทับเวลาจากวันที่ที่มีเส้น $subract
เราทำสิ่งนี้สองสามครั้ง:
{ "$subtract": [ "$timestamp", new Date(0) ] }
// Is roughly internally like
ISODate("2017-06-06T10:44:37.627Z") - ISODate("1970-01-01T00:00:00Z")
1496745877627
จากนั้นจะมีโมดูโลที่มี $mod
ซึ่งเมื่อนำไปใช้กับค่าตัวเลขจะส่งกลับค่าความแตกต่าง 1,000 มิลลิวินาที * 60 วินาที * 60 * นาที * 24 ชั่วโมงให้อาร์กิวเมนต์อื่น:
{ "$mod": [
{ "$subtract": [ "$timestamp", new Date(0) ] },
1000 * 60 * 60 * 24
]}
// Equivalent to
1496745877627 % (1000 * 60 * 60 * 24)
38677627
จากนั้นจะมีการล้อม $subtract
ของตัวเลขทั้งสอง:
{ "$subtract": [
{ "$subtract": [ "$timestamp", new Date(0) ] },
{ "$mod": [
{ "$subtract": [ "$timestamp", new Date(0) ] },
1000 * 60 * 60 * 24
]}
]}
// Subtract "difference" of the modulo to a day
// from the milliseconds value of the current date
1496745877627 - 38677627
1496707200000
จากนั้นเพิ่มกลับไปที่ค่าวันที่ของยุคเพื่อสร้างวันที่ที่ปัดเศษเป็นวันปัจจุบัน ซึ่งโดยทั่วไปแล้วไปป์ไลน์การรวมจะดูเหมือนว่าจะให้ค่ามิลลิวินาทีแก่ตัวสร้าง:
new Date(1496707200000)
ISODate("2017-06-06T00:00:00Z")
ซึ่งใช้ค่าการประทับเวลาและลบส่วนต่างของตัวหารออกจาก "หนึ่งวัน" และจบลงที่เวลาที่ "เริ่มต้นของวัน"
เพียงใช้ $$ROOT
ที่นี่เพื่อแสดงเอกสารทั้งหมด แต่เส้นทางเอกสารใดๆ ที่ให้ไว้กับ $last
ที่นี่จะให้ผลลัพธ์
person
Neil Lunn
schedule
06.06.2017
$group
) และเก็บdata
สุดท้ายไว้กับ$last
- person felix   schedule 06.06.2017