"Коля" "01.05" "работал"
"Коля" "02.05" "не работал"
"Коля" "03.05" "не работал"
"Коля" "05.05" "не работал"
"Коля" "06.05" "работал"
"Коля" "07.05" "работал"
"Коля" "08.05" "не работал"
"Коля" "09.05" "работал"
"Коля" "10.05" "не работал"
"Коля" "11.05" "не работал"
"Коля" "12.05" "не работал"
На выходе:
"Коля" "не работал" "02.05" - "05.05"
"Коля" "не работал" "08.05" - "08.05"
"Коля" "не работал" "10.05" - "12.05"
ну или около того
ну и срань же получилась:
db.getCollection('aggra_sequence').aggregate([
{$group:{
_id: "$user",
as_array: {
$push: { date: "$date", status: "$status"}
}
}},
{
$addFields:{
tmp: { $reduce:{
input: "$as_array",
initialValue: { date : "", status: "", ranges:[]},
in: {
date: "$$this.date",
status: "$$this.status",
ranges: {$cond: {
if: {$eq: ["$$this.status", "$$value.status" ]},
then: {$concatArrays: [
{$slice: ["$$value.ranges", {$subtract: [{$size: "$$value.ranges"}, 1] }]},
[{$let:{
vars: {last: {$arrayElemAt:["$$value.ranges", {$subtract: [{$size: "$$value.ranges"}, 1]}]}},
in: {minDate:"$$last.minDate", maxDate: "$$this.date", status: "$$last.status"}
}}]
]},
else: {$concatArrays: [
"$$value.ranges",
[{minDate:"$$this.date", maxDate: "$$this.date", status: "$$this.status"}]
]}
}}
}
}}
}},
])
на входе были тестовые вида
{
"_id" : ObjectId("6297908b47213c19009579aa"),
"user" : 1,
"date" : "2022-05-01",
"status" : "work"
}
результат:
"tmp" : {
"date" : "2022-05-09",
"status" : "work",
"ranges" : [
{
"minDate" : "2022-05-01",
"maxDate" : "2022-05-01",
"status" : "work"
},
{
"minDate" : "2022-05-02",
"maxDate" : "2022-05-05",
"status" : "not work"
},
{
"minDate" : "2022-05-06",
"maxDate" : "2022-05-06",
"status" : "work"
},
{
"minDate" : "2022-05-07",
"maxDate" : "2022-05-07",
"status" : "not work"
},
{
"minDate" : "2022-05-09",
"maxDate" : "2022-05-09",
"status" : "work"
}
]
}