Du kan använda $range
för att generera arrayer av nummer från 1
till n
där n
är $size
av adds
. Sedan kan du "slinga" genom dessa siffror och kontrollera om adds
vid index
($arrayElemAt
) finns någonstans före index
om ja ska det betraktas som en duplikat. Du kan använda $indexOfArray
för att kontrollera om element finns i array som anger 0 och index
som sökintervall.
Sedan behöver du bara använda $project
och $map
för att ersätta index med faktiska element. Du kan också lägga till $setUnion
för att undvika duplicerade dubbletter i slutresultatuppsättningen.
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" ] } } }, [] ]
}
}
}
])
Utskrifter:
{ "_id" : 1, "adds" : [ "111" ] }
{ "_id" : 2, "adds" : [ "555" ] }
{ "_id" : 3, "adds" : [ "888" ] }