Basierend auf Ihrem Beispiel möchten Sie also die ranktime
ausgeben es sei denn es ist SOURCE2
und das gleiche Datum wurde bereits zur Ausgabe hinzugefügt (jedoch nur für SOURCE2
).
Sie können $reduce
verwenden wie zuvor, aber Sie müssen zuvor hinzugefügte Elemente scannen, was mit $ erreicht werden kann AnyElementTrue
Operator und da Ihre Ausgabe das dritte Element enthält, gehe ich davon aus, dass das wiederholte Datum nur dann eine Stoppbedingung ist, wenn dasselbe Datum für SORUCE2
hinzugefügt wurde also $filter
wird auch benötigt, um den Satz von zuvor hinzugefügten SOURCE2
vorzubereiten s:
db.col.updateMany({}, [
{
$set: {
ranktime: {
$reduce: {
input: "$ranktime",
initialValue: [],
in: {
$cond: [
{
$and: [
{ "$eq": [ "$$this.source", "SOURCE2" ] },
{
$anyElementTrue: {
$map: {
input: { $filter: { input: "$$value", as: "prev", cond: { $eq: { "$$prev.source", "SOURCE2" } } } }, // already added SOURCE2 elements
as: "addedElement",
in: { "$eq": [ { $substr: [ "$$addedElement.datum", 0, 15 ] }, { $substr: [ "$$this.datum", 0, 15 ] } ] }
}
}
}
]
},
"$$value", // skip current element ($$this)
{ $concatArrays: [ "$$value", [ "$$this" ] ] } // add current element to the output
]
}
}
}
}
}
])