Vì vậy, dựa trên ví dụ của bạn, bạn muốn xuất ranktime
trừ khi nó là SOURCE2
và cùng ngày đã được thêm vào đầu ra (nhưng chỉ cho SOURCE2
).
Bạn có thể sử dụng $reduce
như trước đây nhưng bạn cần phải quét các phần tử được thêm trước có thể đạt được bằng cách sử dụng $ anyElementTrue
toán tử và vì đầu ra của bạn chứa phần tử thứ ba, tôi giả sử ngày lặp lại là điều kiện dừng chỉ khi cùng một ngày đã được thêm vào cho SORUCE2
vì vậy $ filter
cũng cần thiết để chuẩn bị tập hợp SOURCE2
được thêm trước 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
]
}
}
}
}
}
])