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

MongoDB:Как да преименувате поле с помощта на регулярен израз

Това не е операция mapReduce, освен ако не искате нова колекция, която се състои само от _id и стойност полета, които се произвеждат от изхода на mapReduce, подобно на:

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

Което в най-добрия случай е вид преработване на вашата колекция от страна на сървъра, но разбира се не в желаната от вас структура.

Въпреки че има начини да изпълните целия код в сървъра, моля, не се опитвайте да го правите, освен ако наистина не сте на място. Тези начини обикновено не работят добре с шардинга, което обикновено е мястото, където хората „наистина са на място“ заради големия размер на записите.

Когато искате да промените нещата и да го направите групово, обикновено трябва да „циклите“ резултатите от събирането и да обработите актуализациите, докато имате достъп до текущата информация за документа. Това е в случай, че вашата „актуализация“ е „базирана на“ информация, която вече се съдържа в полета или структура на документа.

Следователно няма налична операция „regex replace“ и със сигурност няма такава за преименуване на поле. Така че нека зациклим с групови операции за „най-безопасната“ форма за извършване на това, без да изпълнявате кода изцяло на сървъра.

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

Така че основните неща там са $unset оператор за премахване на съществуващото поле и $set оператор за създаване на ново поле в документа. Имате нужда от съдържанието на документа, за да прегледате и използвате както „име на поле“, така и „стойност“, така че оттук и зациклянето, тъй като няма друг начин.

Ако нямате MongoDB 2.6 или по-нова версия на сървъра, тогава концепцията за зацикляне все още остава без незабавна полза от производителността. Можете да разгледате неща като .eval() за да се обработва на сървъра, но както подсказва документацията, наистина не се препоръчва. Използвайте внимателно, ако трябва.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Не може да се свърже с Mongo DB чрез Spark

  2. Последен запис по дата за всяка група mongodb на артикул

  3. Как да експортирате колекция в CSV в MongoDB?

  4. Грешка във връзката с MongoLab/PyMongo

  5. Създайте условен TTL в mongo