Можете да използвате $range
за генериране на масиви от числа от 1
към n
където n
е $size
от adds
. След това можете да преминете през тези числа и да проверите дали adds
в index
($arrayElemAt
) съществува някъде преди index
ако да, тогава трябва да се счита за дубликат. Можете да използвате $indexOfArray
за да проверите дали елементът съществува в масива, указващ 0 и index
като диапазон на търсене.
Тогава просто трябва да използвате $project
и $map
за замяна на индекси с действителни елементи. Можете също да добавите $setUnion
за да се избегнат дублиращи се дубликати в крайния набор от резултати.
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" ] } } }, [] ]
}
}
}
])
Разпечатки:
{ "_id" : 1, "adds" : [ "111" ] }
{ "_id" : 2, "adds" : [ "555" ] }
{ "_id" : 3, "adds" : [ "888" ] }