MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

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

"dropDups" cú pháp để tạo chỉ mục đã "không được chấp nhận" kể từ MongoDB 2.6 và bị loại bỏ trong MongoDB 3.0. Trong hầu hết các trường hợp, sử dụng điều này không phải là một ý kiến ​​hay vì "loại bỏ" là tùy ý và bất kỳ "bản sao" nào cũng có thể bị xóa. Điều đó có nghĩa là những gì được "xóa" có thể không phải là những gì bạn thực sự muốn xóa.

Nhưng dù sao, bạn đang gặp phải lỗi "độ dài chỉ mục" vì giá trị của khóa chỉ mục ở đây sẽ dài hơn được cho phép. Nói chung, bạn không "muốn" lập chỉ mục 43 trường trong bất kỳ ứng dụng thông thường nào.

Nếu bạn muốn xóa "bản sao" khỏi một bộ sưu tập thì cách tốt nhất của bạn là chạy một truy vấn tổng hợp để xác định tài liệu nào chứa dữ liệu "trùng lặp" và sau đó duyệt qua danh sách đó để xóa "tất cả trừ một" trong số đã "duy nhất" _id giá trị từ tập hợp mục tiêu. Điều này có thể được thực hiện với các hoạt động "Hàng loạt" để đạt hiệu quả tối đa.

LƯU Ý :Tôi thực sự cảm thấy khó tin rằng tài liệu của bạn thực sự chứa 43 trường "duy nhất". Có khả năng là "tất cả những gì bạn cần" là chỉ để xác định chỉ những trường làm cho tài liệu trở thành "duy nhất" và sau đó thực hiện theo quy trình như được nêu bên dưới:

var bulk = db.testkdd.initializeOrderedBulkOp(),
    count = 0;

// List "all" fields that make a document "unique" in the `_id`
// I am only listing some for example purposes to follow
db.testkdd.aggregate([
    { "$group": {
        "_id": {
           "duration" : "$duration",
          "protocol_type": "$protocol_type", 
          "service": "$service",
          "flag": "$flag"
        },
        "ids": { "$push": "$_id" },
        "count": { "$sum": 1 }
    }},
    { "$match": { "count": { "$gt": 1 } } }
],{ "allowDiskUse": true}).forEach(function(doc) {
    doc.ids.shift();     // remove first match
    bulk.find({ "_id": { "$in": doc.ids } }).remove();  // removes all $in list
    count++;

    // Execute 1 in 1000 and re-init
    if ( count % 1000 == 0 ) {
       bulk.execute();
       bulk = db.testkdd.initializeOrderedBulkOp();
    }
});

if ( count % 1000 != 0 ) 
    bulk.execute();

Nếu bạn có phiên bản MongoDB "thấp hơn" 2.6 và không có các hoạt động hàng loạt thì bạn có thể thử với .remove() tiêu chuẩn bên trong vòng lặp. Cũng lưu ý rằng .aggregate() sẽ không trả về con trỏ ở đây và vòng lặp phải thay đổi thành:

db.testkdd.aggregate([
   // pipeline as above
]).result.forEach(function(doc) {
    doc.ids.shift();  
    db.testkdd.remove({ "_id": { "$in": doc.ids } });
});

Nhưng hãy đảm bảo xem xét kỹ tài liệu của bạn và chỉ bao gồm "chỉ" các trường "duy nhất" mà bạn mong đợi là một phần của nhóm _id . Nếu không, bạn sẽ không xóa gì cả, vì không có bản sao nào ở đó.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Nhà điều hành đường ống tổng hợp MongoDB $ sum

  2. Giới thiệu Biểu đồ tra cứu trong MongoDB

  3. Làm thế nào để cài đặt mongoDB trên Windows?

  4. Tổng hợp MongoDB với trình điều khiển Java

  5. mongoose / mongodb tùy chỉnh sắp xếp