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
]
}
}
}
}
}
])