Du kan bruge $range
at generere arrays af tal fra 1
til n
hvor n
er $size
af adds
. Så kan du "sløjfe" gennem disse tal og kontrollere, om adds
ved index
($arrayElemAt
) eksisterer et sted før index
hvis ja, skal det betragtes som et duplikat. Du kan bruge $indexOfArray
for at kontrollere, om element findes i array, der angiver 0 og index
som søgeområde.
Så skal du bare bruge $project
og $map
at erstatte indekser med faktiske elementer. Du kan også tilføje $setUnion
for at undgå duplikerede dubletter i det endelige resultatsæt.
db.users.aggregate([
{
$addFields: {
duplicates: {
$filter: {
input: { $range: [ 1, { $size: "$adds" } ] },
as: "index",
cond: {
$ne: [ { $indexOfArray: [ "$adds", { $arrayElemAt: [ "$adds", "$$index" ] }, 0, "$$index" ] }, -1 ]
}
}
}
}
},
{
$project: {
_id: 1,
adds: {
$setUnion: [ { $map: { input: "$duplicates", as: "d", in: { $arrayElemAt: [ "$adds", "$$d" ] } } }, [] ]
}
}
}
])
Udskrifter:
{ "_id" : 1, "adds" : [ "111" ] }
{ "_id" : 2, "adds" : [ "555" ] }
{ "_id" : 3, "adds" : [ "888" ] }