Created
January 31, 2024 07:15
-
-
Save akash-gajjar/e38ef09b098515c8277e31bd2cb91e8a to your computer and use it in GitHub Desktop.
Driver Change in Vehicle name using MongoDB query
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[ | |
{ | |
$match: { | |
driver_id: ObjectId( | |
"656d9b8c6a91175eb8c3ea3a" | |
), | |
vehicle_name: { $nin: ["", "0", null] }, | |
// vehicle_name: "5405" | |
}, | |
}, | |
{ | |
$project: { | |
driver_id: 1, | |
start_time: 1, | |
end_time: 1, | |
vehicle_name: 1, | |
}, | |
}, | |
{ | |
$sort: { | |
start_time: 1, | |
}, | |
}, | |
// calculate change in vehicle_name, keeping backward and forward change | |
// so we can later keep last documents end_time | |
{ | |
$setWindowFields: { | |
sortBy: { start_time: 1 }, | |
output: { | |
backward: { | |
$push: { | |
name: "$vehicle_name", | |
end_time: "$end_time", | |
}, | |
window: { documents: [-1, "current"] }, | |
}, | |
forward: { | |
$push: { | |
name: "$vehicle_name", | |
end_time: "$end_time", | |
}, | |
window: { documents: ["current", 1] }, | |
}, | |
}, | |
}, | |
}, | |
{ | |
$match: { | |
$expr: { | |
$or: [ | |
{ $eq: [{ $size: "$backward" }, 1] }, // first document will have only one entry | |
{ $eq: [{ $size: "$forward" }, 1] }, // last document will have only one entry | |
{ | |
// keep only documents where there is a change in vehicle_name | |
$ne: [ | |
{ $first: "$backward.name" }, | |
{ $last: "$backward.name" }, | |
], | |
}, | |
], | |
}, | |
}, | |
}, | |
{ | |
// add fields for end time | |
$addFields: { | |
previousDocTime: { $first: "$backward" }, | |
currentDocTime: { $last: "$backward" }, | |
}, | |
}, | |
{ | |
$project: { | |
forward: 0, | |
}, | |
}, | |
{ | |
// fetch previousDocTime from next document in dates key | |
$setWindowFields: { | |
sortBy: { start_time: 1 }, | |
output: { | |
dates: { | |
$push: "$previousDocTime", | |
window: { documents: ["current", 1] }, | |
}, | |
}, | |
}, | |
}, | |
{ | |
// take last end_time from dates | |
$addFields: { | |
end_time: { | |
$last: "$dates.end_time", | |
}, | |
}, | |
}, | |
{ | |
// remove extra fields | |
$unset: [ | |
"pair", | |
"previousDocTime", | |
"currentDocTime", | |
"dates", | |
"backward", | |
], | |
}, | |
{ | |
$match: { | |
$expr: { $ne: ["$start_time", "$end_time"]} | |
} | |
} | |
] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment