Ну, нам нужно сделать это в два шага.
Пояснение
- Нам нужно найти последние
DATE_TIME
с $addFields
.
var MAX_DT = "1970-01-01T00:00:00:00.000Z";
for(var dt in WORKFLOWS[*].HISTORY[*].DATE_TIME){
MAX_DT = MAX_DT > dt ? MAX_DT : dt
}
На следующем шаге мы перебираем массивы WORKFLOWS
и HISTORY
с оператором $map
и добавляем текущую дату с $$ NOW (автономно) или $$ CLUSTER_TIME (кластер). $dateToString
позволяет указать timezone
для настройки HH:MM
результата.
Если вы хотите сохранить результат, просто добавьте в качестве последнего шага оператор $out
:
{$ out: "collection"}
Примечание: Переопределит всю коллекцию с результатом агрегации.
db.collection.aggregate([
{
$addFields: {
"MAX_DT": {
$reduce: {
input: {
$reduce: {
input: "$WORKFLOWS.HISTORY.DATE_TIME",
initialValue: [],
in: {
$concatArrays: [ "$$value", "$$this" ]
}
}
},
initialValue: "1970-01-01T00:00:00:00.000Z",
in: {
$cond: [
{
$gt: [ "$$value", "$$this" ]
},
"$$value",
"$$this"
]
}
}
}
}
},
{
$addFields: {
"WORKFLOWS": {
$map: {
input: "$WORKFLOWS",
as: "wf",
in: {
$mergeObjects: [
"$$wf",
{
HISTORY: {
$map: {
input: "$$wf.HISTORY",
as: "his",
in: {
$cond: [
{
$eq: [ "$$his.DATE_TIME", "$MAX_DT" ]
},
{
$mergeObjects: [
"$$his",
{
REMINDER: {
$concatArrays: [
{
$ifNull: [ "$$his.REMINDER", [] ]
},
[
{
$dateToString: {
date: "$$NOW",
timezone: "+02:00"
}
}
]
]
}
}
]
},
"$$his"
]
}
}
}
}
]
}
}
}
}
}
])
MongoPlayground