MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Hapus Duplikat dari MongoDB

"dropDups" sintaks untuk pembuatan indeks telah "usang" pada MongoDB 2.6 dan dihapus di MongoDB 3.0. Ini bukan ide yang sangat baik dalam banyak kasus untuk menggunakan ini karena "penghapusan" adalah sewenang-wenang dan "duplikat" apa pun dapat dihapus. Artinya, apa yang "dihapus" mungkin bukan yang sebenarnya ingin Anda hapus.

Bagaimanapun, Anda mengalami kesalahan "panjang indeks" karena nilai kunci indeks di sini akan lebih lama dari yang diizinkan. Secara umum, Anda tidak "dimaksudkan" untuk mengindeks 43 bidang dalam aplikasi normal apa pun.

Jika Anda ingin menghapus "duplikat" dari koleksi, maka taruhan terbaik Anda adalah menjalankan kueri agregasi untuk menentukan dokumen mana yang berisi data "duplikat" dan kemudian menelusuri daftar itu dengan menghapus "semua kecuali satu" dari yang sudah "unik" _id nilai dari koleksi target. Ini dapat dilakukan dengan operasi "Massal" untuk efisiensi maksimum.

CATATAN :Saya merasa sulit untuk percaya bahwa dokumen Anda sebenarnya berisi 43 bidang "unik". Sepertinya "semua yang Anda butuhkan" adalah hanya mengidentifikasi hanya bidang-bidang yang membuat dokumen "unik" dan kemudian ikuti proses seperti yang diuraikan di bawah ini:

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();

Jika Anda memiliki versi MongoDB "lebih rendah" dari 2.6 dan tidak memiliki operasi massal maka Anda dapat mencoba dengan .remove() standar di dalam lingkaran juga. Perhatikan juga bahwa .aggregate() tidak akan mengembalikan kursor di sini dan perulangan harus berubah menjadi:

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

Tetapi pastikan untuk melihat dokumen Anda dengan cermat dan hanya menyertakan "hanya" bidang "unik" yang Anda harapkan untuk menjadi bagian dari pengelompokan _id . Jika tidak, Anda tidak akan menghapus apa pun, karena tidak ada duplikat di sana.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. nilai grup mongodb berdasarkan beberapa bidang

  2. Penjelasan MongoDB Upsert

  3. Cara menangkap pengecualian saat membuat instance MongoClient

  4. Perbarui bidang dalam array elemen yang tepat di MongoDB

  5. Di mana posisi mongodb dalam teorema CAP?