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

Menghapus spasi putih (awal dan akhir) dari nilai string

Saat ini pembaruan di MongoDB tidak mungkin untuk merujuk ke nilai yang ada dari bidang saat ini saat menerapkan pembaruan. Jadi, Anda harus mengulang:

db.collection.find({},{ "category": 1 }).forEach(function(doc) {
   doc.category = doc.category.trim();
   db.collection.update(
       { "_id": doc._id },
       { "$set": { "category": doc.category } }
   );
})

Memperhatikan penggunaan $set operator di sana dan bidang "kategori" yang diproyeksikan hanya untuk mengurangi lalu lintas jaringan"

Anda dapat membatasi apa yang diproses dengan $regex untuk mencocokkan:

db.collection.find({ 
    "$and": [
        { "category": /^\s+/ },
        { "category": /\s+$/ }
    ]
})

Atau bahkan sebagai $regex pure murni tanpa menggunakan $and yang hanya Anda perlukan di MongoDB di mana beberapa kondisi akan diterapkan ke bidang yang sama. Jika tidak, $and tersirat untuk semua argumen:

db.collection.find({ "category": /^\s+|\s+$/ })

Yang membatasi dokumen yang cocok untuk diproses hanya untuk dokumen dengan spasi putih di depan atau di belakang.

Jika Anda khawatir tentang jumlah dokumen yang harus dilihat, pembaruan massal akan membantu jika Anda memiliki MongoDB 2.6 atau lebih tinggi yang tersedia:

var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1 }).forEach(
    function(doc) {
        batch.push({
            "q": { "_id": doc._id },
            "u": { "$set": { "category": doc.catetgory.trim() } }
        });

        if ( batch.length % 1000 == 0 ) {
            db.runCommand("update", batch);
            batch = [];
        }
    }
);

if ( batch.length > 0 )
    db.runCommand("update", batch);

Atau bahkan dengan API operasi massal untuk MongoDB 2.6 dan yang lebih baru:

var counter = 0;
var bulk = db.collection.initializeOrderedBulkOp();
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
    function(doc) {
        bulk.find({ "_id": doc._id }).update({
            "$set": { "category": doc.category.trim() }
        });
        counter = counter + 1;

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

if ( counter > 1 )
    bulk.execute();

Terbaik selesai dengan bulkWrite() untuk API modern yang menggunakan API Operasi Massal ( secara teknis semuanya lakukan sekarang ) tetapi sebenarnya dengan cara yang regresif dengan aman dengan versi MongoDB yang lebih lama. Meskipun sejujurnya itu berarti sebelum MongoDB 2.6 dan Anda akan jauh dari jangkauan untuk opsi dukungan resmi menggunakan versi seperti itu. Pengkodean agak lebih bersih untuk ini:

var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
  function(doc) {
    batch.push({
      "updateOne": {
        "filter": { "_id": doc._id },
        "update": { "$set": { "category": doc.category.trim() } }
      }
    });

    if ( batch.legth % 1000 == 0 ) {
      db.collection.bulkWrite(batch);
      batch = [];
    }
  }
);

if ( batch.length > 0 ) {
  db.collection.bulkWrite(batch);
  batch = [];
}

Yang semuanya hanya mengirim operasi ke server sekali per 1000 dokumen, atau modifikasi sebanyak yang Anda bisa muat di bawah batas BSON 64MB.

Sebagai hanya beberapa cara untuk mendekati masalah. Atau perbarui file CSV Anda terlebih dahulu sebelum mengimpor.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara Memeriksa Tipe Data Kolom di SQL

  2. Temukan catatan MongoDB di mana bidang array tidak kosong

  3. Mengapa tidak disarankan untuk menggunakan fungsi tersimpan sisi server di MongoDB?

  4. Temukan dokumen dengan array yang tidak berisi dokumen dengan nilai bidang tertentu di MongoDB

  5. MongoDB $min Agregasi Pipeline Operator