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

MongoDB:Cara mengganti nama bidang menggunakan regex

Ini bukan operasi mapReduce, kecuali jika Anda menginginkan koleksi baru yang hanya terdiri dari _id dan value bidang yang dihasilkan dari output mapReduce, seperti:

    "_id": ObjectId("53f2b954b55e91756c81d3a5"), 
    "value": { 
        "domain": "example.com",
        ... 
    } 
}

Yang terbaik adalah semacam pengerjaan ulang "sisi server" dari koleksi Anda, tetapi tentu saja tidak dalam struktur yang Anda inginkan.

Meskipun ada cara untuk mengeksekusi semua kode di server, mohon jangan mencoba melakukannya kecuali Anda benar-benar berada di tempat. Cara ini umumnya tidak cocok dengan sharding, yang biasanya di mana orang "benar-benar berada di tempat" untuk ukuran rekaman yang tipis.

Ketika Anda ingin mengubah sesuatu dan melakukannya secara massal, Anda biasanya harus "mengulang" hasil pengumpulan dan memproses pembaruan sambil memiliki akses ke informasi dokumen saat ini. Artinya, jika "pembaruan" Anda "berdasarkan" informasi yang sudah ada di bidang atau struktur dokumen.

Oleh karena itu tidak ada operasi "penggantian regex" yang tersedia, dan tentu saja tidak ada operasi untuk mengganti nama bidang. Jadi mari kita mengulang dengan operasi massal untuk bentuk "paling aman" melakukan ini tanpa menjalankan semua kode di server.

var bulk = db.collection.initializeOrderedBulkOp();
var counter = 0;

db.collection.find().forEach(function(doc) {

    for ( var k in doc ) {
        if ( doc[k].match(/^2014.*/) ) {
            var update = {};
            update["$unset"][k] = 1;
            update["$set"][ k.replace(/(\d+)-(\d+)-(\d+).+/,"$1$2$3") ] = doc[k];
            bulk.find({ "_id": doc._id }).updateOne(update);
            counter++;
        }
    }

    if ( counter % 1000 == 0 ) {
        bulk.execute();
        bulk = db.collection.initializeOrderedBulkOp();
    }

});

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

Jadi yang utama ada $unset operator untuk menghapus bidang yang ada dan $set operator untuk membuat bidang baru dalam dokumen. Anda memerlukan konten dokumen untuk memeriksa dan menggunakan "nama bidang" dan "nilai", jadi perulangan karena tidak ada cara lain.

Jika Anda tidak memiliki MongoDB 2.6 atau lebih tinggi di server, maka konsep perulangan masih tetap tanpa manfaat kinerja langsung. Anda dapat melihat hal-hal seperti .eval() untuk memproses di server, tetapi seperti yang disarankan oleh dokumentasi, itu benar-benar tidak disarankan. Gunakan dengan hati-hati jika Anda harus.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cache objek koleksi Mongodb di Node.js

  2. MongoSocketReadException:Mencapai akhir aliran sebelum waktunya (setelah periode tidak aktif)

  3. Bagaimana Anda memodelkan hubungan pertemanan di MongoDB?

  4. Spring boot 2.0.5.RELEASE dan masalah koneksi mongo 4.0

  5. MongoDB:Mendapatkan daftar semua database?