MongoDB loại bỏ trùng lặp trong mảng

Công việc DBA rất quan trọng và nhạy cảm; . Để đảm bảo tính nhất quán của dữ liệu, đôi khi chúng ta cần loại bỏ các bản ghi trùng lặp ngoại trừ một bản ghi


Giải pháp. một số giải pháp được đưa ra dưới đây để loại bỏ các bản ghi trùng lặp trong MongoDB. Đầu tiên, chúng tôi sẽ tạo kịch bản sau đó và chúng tôi sẽ khắc phục sự cố bằng một số lệnh.


Giả sử chúng ta có bộ sưu tập Nhân viên như dưới đây



{

    "_id". ObjectId("5e5f5cf8cad2677f9f839323"),

    "Tên". "Dilip",

    "EmpId". 1. 0,

    "Bộ phận". "NÓ"

}

{

    "_id". ObjectId("5e5f5d20cad2677f9f839327"),

    "Tên". "Dilip",

    "EmpId". 1. 0,

    "Bộ phận". "NÓ"

}

{

    "_id". ObjectId("5e5f5d27cad2677f9f839328"),

    "Tên". "Dilip",

    "EmpId". 1. 0,

    "Bộ phận". "NÓ"

}

{

    "_id". ObjectId("5e5f5d3bcad2677f9f839329"),

    "Tên". "Anil",

    "EmpId". 2. 0,

    "Bộ phận". "nhân sự"

}

{

    "_id". ObjectId("5e5f5d42cad2677f9f83932a"),

    "Tên". "Anil",

    "EmpId". 2. 0,

    "Bộ phận". "nhân sự"

}



Chúng tôi có thể xem các tài liệu trùng lặp cho nhân viên "Dilip" và "Anil". Bây giờ chúng ta sẽ làm gì, chúng ta xóa tài liệu ngoại trừ từng tài liệu

Sử dụng tổng hợp nhóm


var trùng lặpIds = [];

db. Nhân viên. tổng hợp([

        {

            $group. {

                _id. {

                    EmpId. "$EmpId"

                },

                lặp. {

                    "$addToSet". "$_id"

                },

                đếm. {

                     "$sum". 1

                }

            }

        }, {

            $match. {

                đếm. {

                    "$gt". 1

                }

            }

        }

    ], {

    cho phépDiskUse. đúng

}). forEach(function (doc) {

    doc. bịp bợm. ca();

    doc. bịp bợm. forEach(hàm (dupId) {

        id trùng lặp. đẩy(dupId);

    })

});

printjson(duplicatesIds);  


db. Nhân viên. xóa ({_id. {$in. DuplicateIds}})  

db. Nhân viên. tìm thấy();



Bây giờ chúng ta sẽ phân tích truy vấn được viết ở trên

1- varplicationsIds = []. Đây là một khai báo mảng mà truy vấn này sẽ đẩy các ID trùng lặp.


2-{$group. {_Tôi. {EmpId. "$EmpId"},dup. {"$addToSet". "$_id"} , đếm. {"$sum". 1}}}. Ở đây chúng tôi đang nhóm các bản ghi thay mặt cho EmpId và sử dụng lệnh $addToSet, chúng tôi có thể tạo một mảng "dups" và đếm. {"$sum". 1} đang đếm các bản ghi trùng lặp.


3- {$match. {đếm. {"$gt". 1}}}. Ở đây chúng tôi đang lọc các bản ghi có số đếm lớn hơn 1. Như quy trình nhóm ở trên, chúng tôi đang đếm các bản ghi trùng lặp thay mặt cho EmpId.


4- ForEach. ở đây chúng ta đang lặp lại từng bản ghi được nhóm EmpId, ở đây chúng ta sẽ tìm thấy mảng các bản ghi trùng lặp, chẳng hạn 

"lừa đảo". [

        ObjectId("5e5f5d20cad2677f9f839327"),

        ObjectId("5e5f5d27cad2677f9f839328"),

        ObjectId("5e5f5cf8cad2677f9f839323")

    ].


5- tài liệu. bịp bợm. sự thay đổi(). Ở đây chúng tôi đang xóa một bản ghi sẽ không bị xóa và Điều đó có nghĩa là chúng tôi sẽ xóa các bản sao ngoại trừ một tài liệu.


6- tài liệu. bịp bợm. forEach(hàm (dupId). ở đây một lần nữa, chúng tôi đang lặp lại mảng để đẩy (duplicatesIds. push(dupId)) nó ghi (duplicatesIds) vào mảng đã khai báo ở trên.

Làm cách nào để xóa các bản sao khỏi mảng trong MongoDB?

Nhưng các nguyên tắc vẫn giữ nguyên. .
Xác định các bản sao trong tài liệu
Lặp lại kết quả để đưa ra các bản cập nhật cho các tài liệu bị ảnh hưởng
Sử dụng $unset với toán tử $ vị trí để đặt phần tử mảng phù hợp "đầu tiên" thành null
Sử dụng $pull để xóa mục null khỏi mảng

Làm cách nào để xóa các mục trùng lặp trong một mảng?

Chúng ta có thể loại bỏ phần tử trùng trong mảng bằng 2 cách. dùng mảng tạm thời hoặc dùng chỉ mục riêng . Để loại bỏ phần tử trùng lặp khỏi mảng, mảng phải được sắp xếp theo thứ tự. Nếu mảng không được sắp xếp, bạn có thể sắp xếp nó bằng cách gọi Arrays. phương thức sắp xếp (mảng).

Làm cách nào để xóa các bản sao trong MongoDB?

Có thể xóa các bản ghi trùng lặp khỏi bộ sưu tập MongoDB bằng cách tạo một chỉ mục duy nhất trên bộ sưu tập và chỉ định tùy chọn dropDups . Đây là dấu vết của phiên hiển thị nội dung của bộ sưu tập trước và sau khi tạo chỉ mục duy nhất với dropDups.