Skip to content

Instantly share code, notes, and snippets.

@akash-gajjar
Created January 31, 2024 07:15
Show Gist options
  • Save akash-gajjar/e38ef09b098515c8277e31bd2cb91e8a to your computer and use it in GitHub Desktop.
Save akash-gajjar/e38ef09b098515c8277e31bd2cb91e8a to your computer and use it in GitHub Desktop.
Driver Change in Vehicle name using MongoDB query
[
{
$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