Bạn có thể sử dụng $ range
để tạo mảng số từ 1
thành n
ở đâu n
là $ size
của adds
. Sau đó, bạn có thể "lặp" qua các con số đó và kiểm tra xem adds
không tại index
( $ arrayElemAt
) tồn tại ở đâu đó trước index
nếu có thì nó nên được coi là một bản sao. Bạn có thể sử dụng $ indexOfArray
để kiểm tra xem phần tử có tồn tại trong mảng chỉ định 0 và index
hay không dưới dạng phạm vi tìm kiếm.
Sau đó, bạn chỉ cần sử dụng $project
và $ map
để thay thế các chỉ mục bằng các phần tử thực tế. Bạn cũng có thể thêm $ setUnion
để tránh trùng lặp trong tập kết quả cuối cùng.
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" ] } } }, [] ]
}
}
}
])
Bản in:
{ "_id" : 1, "adds" : [ "111" ] }
{ "_id" : 2, "adds" : [ "555" ] }
{ "_id" : 3, "adds" : [ "888" ] }