MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Премахване на бели интервали (водещи и крайни) от стойността на низа

Понастоящем не е възможно актуализация в MongoDB да се отнася до съществуващата стойност на текущо поле при прилагане на актуализацията. Така че ще трябва да завъртите:

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

Отбелязвайки използването на $set оператор там и прогнозираното поле "категория" само с цел намаляване на мрежовия трафик"

Можете да ограничите това, което обработва с $regex за съвпадение:

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

Или дори като чист $regex без използването на $and което ви е необходимо само в MongoDB, където множество условия биха били приложени към едно и също поле. В противен случай $and е имплицитно за всички аргументи:

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

Което ограничава обработването на съвпадащите документи само до тези с начално или крайно бяло пространство.

Ако се притеснявате за броя на документите, които трябва да търсите, груповата актуализация би трябвало да помогне, ако имате MongoDB 2.6 или по-нова версия:

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

Или дори с API за групови операции за MongoDB 2.6 и по-нова версия:

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

Най-добър направено с bulkWrite() за съвременни API, които използват API за групови операции (технически всичко прави сега ), но всъщност по начин, който е безопасно регресивен с по-стари версии на MongoDB. Макар че, честно казано, това би означавало преди MongoDB 2.6 и ще бъдете извън покритието за официални опции за поддръжка, използвайки такава версия. Кодирането е малко по-чисто за това:

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 = [];
}

Които всички изпращат операции до сървъра веднъж на 1000 документа или толкова модификации, колкото можете да поберете под ограничението от 64MB BSON.

Като само няколко начина за подход към проблема. Или първо актуализирайте своя CSV файл, преди да импортирате.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Преданият аргумент трябва да е низ от 24 шестнадесетични символа - мисля, че е така

  2. MongoDB, изпълнение на заявка чрез регулярен израз в индексирани полета

  3. Как да създадете и предадете bson документ - Go lang?

  4. Използване на генератори на Active Record след инсталиране на Mongoid?

  5. Машинни пулове и облачни профили за MongoDB