したがって、例に基づいて、ranktime
を出力します。 そうでない場合 SOURCE2
です および 同じ日付がすでに出力に追加されています(ただし、SOURCE2
の場合のみ) 。
$reduce
を使用できます 以前と同じですが、以前に追加した要素をスキャンする必要があります。これは、 $ anyElementTrue
演算子であり、出力には3番目の要素が含まれているため、SORUCE2
に同じ日付が追加されている場合にのみ、繰り返し日付が停止条件であると想定しています。 したがって、 $ filter
以前に追加されたSOURCE2
のセットを準備するためにも必要です 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
]
}
}
}
}
}
])