तो आपके उदाहरण के आधार पर आप ranktime
. आउटपुट करना चाहते हैं जब तक यह SOURCE2
है और वही तारीख पहले ही आउटपुट में जोड़ी जा चुकी है (लेकिन केवल SOURCE2
. के लिए) )।
आप $reduce
. का उपयोग कर सकते हैं पहले की तरह लेकिन आपको पहले जोड़े गए तत्वों को स्कैन करने की आवश्यकता है जो $ का उपयोग करके प्राप्त किया जा सकता है। AnyElementTrue
ऑपरेटर और चूंकि आपके आउटपुट में तीसरा तत्व है, मैं मान रहा हूं कि दोहराई गई तारीख एक स्टॉप कंडीशन है, अगर वही तारीख SORUCE2
के लिए जोड़ी गई है इसलिए $filter
पहले से जोड़े गए SOURCE2
. के सेट को तैयार करने के लिए भी आवश्यक है रों:
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
]
}
}
}
}
}
])