Giả sử một bộ sưu tập tài liệu có tên name
(sử dụng name
thay vì url
) trường bao gồm các giá trị trùng lặp. Tôi có hai tổng hợp trả về một số đầu ra có thể được sử dụng để xử lý thêm. Tôi hy vọng bạn sẽ thấy điều này hữu ích.
{ _id: 1, name: "jack" },
{ _id: 2, name: "john" },
{ _id: 3, name: "jim" },
{ _id: 4, name: "john" }
{ _id: 5, name: "john" },
{ _id: 6, name: "jim" }
Lưu ý rằng "john" có 3 lần xuất hiện và "jim" có 2 lần xuất hiện.
(1) Tổng hợp này trả về các tên trùng lặp (nhiều hơn một lần xuất hiện):
db.collection.aggregate( [
{
$group: {
_id: "$name",
count: { $sum: 1 }
}
},
{
$group: {
_id: "duplicate_names",
names: { $push: { $cond: [ { $gt: [ "$count", 1 ] }, "$_id", "$DUMMY" ] } }
}
}
] )
Đầu ra:
{ "_id" : "duplicate_names", "names" : [ "john", "jim" ] }
(2) Tập hợp sau chỉ trả về _id
giá trị trường cho các tài liệu trùng lặp. Ví dụ:tên "jim" có _id
giá trị 3
và 6
. Đầu ra chỉ có id cho các tài liệu trùng lặp, tức là 6
.
db.colection.aggregate( [
{
$group: {
_id: "$name",
count: { $sum: 1 },
ids: { $push: "$_id" }
}
},
{
$group: {
_id: "duplicate_ids",
ids: { $push: { $slice: [ "$ids", 1, 9999 ] } }
}
},
{
$project: {
ids: {
$reduce: {
input: "$ids",
initialValue: [ ],
in: { $concatArrays: [ "$$this", "$$value" ] }
}
}
}
}
] )
Đầu ra:
{ "_id" : duplicate_ids", "ids" : [ 6, 4, 5 ] }