MongoDB loại bỏ các tài liệu trùng lặp

Trong MongoDB, giai đoạn đường dẫn tổng hợp $unionWith thực hiện kết hợp hai bộ sưu tập và nó bao gồm các bản sao

Điều này hoạt động theo cách tương tự như UNION ALL của SQL, cũng bao gồm các bản sao. Ngược lại, chỉ sử dụng

db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )
0 (i. e. không có
db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )
1) trong SQL loại bỏ trùng lặp

Trong MongoDB, chúng tôi không có tùy chọn chỉ định

db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )
2 hoặc tương tự, vì vậy chúng tôi cần giảm trùng lặp theo cách khác

Trong MongoDB, chúng tôi có thể loại bỏ các bản sao bằng cách sử dụng giai đoạn

db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )
0

Thí dụ

Giả sử chúng ta chèn các tài liệu sau vào hai bộ sưu tập;

db.cats.insertMany([
    { _id: 1, name: "Fluffy", type: "Cat", weight: 5 },
    { _id: 2, name: "Scratch", type: "Cat", weight: 3 },
    { _id: 3, name: "Meow", type: "Cat", weight: 7 }
    ])

db.dogs.insertMany([
    { _id: 1, name: "Wag", type: "Dog", weight: 20 },
    { _id: 2, name: "Bark", type: "Dog", weight: 10 },
    { _id: 3, name: "Fluffy", type: "Dog", weight: 40 }
    ])

Và giả sử chúng ta chạy truy vấn sau để trả về tất cả các tên từ cả hai bộ sưu tập

db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )

Kết quả

{ "name" : "Fluffy" }
{ "name" : "Scratch" }
{ "name" : "Meow" }
{ "name" : "Wag" }
{ "name" : "Bark" }
{ "name" : "Fluffy" }

Ta có thể thấy cái tên Fluffy xuất hiện 2 lần. Điều này là do có hai Fluffy trong bộ sưu tập của chúng tôi – một trong bộ sưu tập

db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )
1 và một trong bộ sưu tập
db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] )
2

Điều này tốt nếu chúng tôi hài lòng khi có các giá trị trùng lặp. Nhưng nếu chúng ta không làm thì sao?

Xóa các bản sao khỏi MongoDB

27 tháng 2 năm 2014 5 Nhận xét

QUAN TRỌNG. Tùy chọn dropDups đã bị xóa bắt đầu với MongoDB 3. x, vì vậy giải pháp này chỉ hợp lệ cho MongoDB phiên bản 2. x trở về trước. Không có sự thay thế trực tiếp nào cho tùy chọn dropDups. Các câu trả lời cho câu hỏi đặt ra tại http. // stackoverflow. com/questions/30187688/mongo-3-duplicates-on-unique-index-dropdups cung cấp một số cách thay thế khả thi để loại bỏ các bản sao trong Mongo 3. x

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 .

Giả sử bộ sưu tập bao gồm một trường có tên record_id xác định duy nhất một bản ghi trong bộ sưu tập, lệnh sẽ sử dụng để tạo một chỉ mục duy nhất và .

db. thu thập. ensureIndex( { record_id. 1 }, { duy nhất. đúng, dropDups. ĐÚNG VẬY } )

Đâ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. Lưu ý rằng các bản ghi trùng lặp không còn xuất hiện sau khi chỉ mục được tạo

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 ghi trùng lặp khỏi MongoDB?

phương thức dropDups() chỉ giữ lại ngẫu nhiên 1 tài liệu và xóa/xóa/bỏ vĩnh viễn tất cả các mục nhập/tài liệu trùng lặp khác. Ghi chú. Vì các tài liệu bị xóa ngẫu nhiên và không thể khôi phục được nên bạn cần hết sức cẩn thận khi sử dụng phương thức dropDup().

Làm cách nào để xóa tất cả tài liệu trong MongoDB?

Để xóa tất cả tài liệu khỏi bộ sưu tập, chuyển tài liệu bộ lọc trống {} vào db. bộ sưu tập. phương thức xóaMany() . Phương thức trả về một tài liệu với trạng thái hoạt động.

Bạn có nên loại bỏ dữ liệu trùng lặp?

Tổng hợp dữ liệu và lỗi đánh máy của con người là một số nguồn dữ liệu trùng lặp. Khách hàng cũng có thể cung cấp cho công ty những thông tin khác nhau tại các thời điểm khác nhau. Do đó, các doanh nghiệp nên cân nhắc xóa các bản ghi trùng lặp khỏi Cơ sở dữ liệu của mình .

Làm cách nào để có được các tài liệu duy nhất trong MongoDB?

Để nhận các giá trị duy nhất và bỏ qua các giá trị trùng lặp, hãy sử dụng differ() trong MongoDB . khác biệt () tìm các giá trị riêng biệt cho một trường được chỉ định trên một bộ sưu tập và trả về kết quả trong một mảng.