Làm cách nào để loại bỏ các bản sao trong mảng trong MongoDB?

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. Người lao động. 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. Người lao động. xóa [{_id. {$in. DuplicateIds}}]  

db. Người lao động. 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 bạn có thể loại bỏ các bản sao khỏi mảng?

Cho một mảng đã sắp xếp, nhiệm vụ là loại bỏ các phần tử trùng lặp khỏi mảng. Tạo một mảng phụ temp[] để lưu trữ các phần tử duy nhất. Duyệt qua mảng đầu vào và sao chép từng phần tử duy nhất của mảng[] sang temp[]. Đồng thời theo dõi số lượng phần tử duy nhất .

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.

Chủ Đề