Toto není operace mapReduce, pokud nechcete novou kolekci, která se skládá pouze z _id
a value
pole, která jsou vytvořena z výstupu mapReduce, podobně jako:
"_id": ObjectId("53f2b954b55e91756c81d3a5"),
"value": {
"domain": "example.com",
...
}
}
Což je přinejlepším jakési „serverové“ přepracování vaší sbírky, ale samozřejmě ne ve struktuře, kterou chcete.
I když existují způsoby, jak spustit veškerý kód na serveru, nepokoušejte se o to, pokud nejste skutečně na místě. Tyto způsoby si stejně obecně nehrají dobře se shardováním, což je obvykle místo, kde jsou lidé „skutečně na místě“ pro samotnou velikost záznamů.
Když chcete věci změnit a udělat to hromadně, musíte obecně „smyčkovat“ výsledky shromažďování a zpracovávat aktualizace a zároveň mít přístup k aktuálním informacím o dokumentu. Tedy v případě, kdy je vaše „aktualizace“ „založena“ na informacích již obsažených v polích nebo struktuře dokumentu.
Proto není k dispozici operace „nahrazení regulárního výrazu“ a rozhodně neexistuje žádná operace pro přejmenování pole. Pojďme tedy do smyčky s hromadnými operacemi pro "nejbezpečnější" formu, jak to udělat bez spouštění kódu na serveru.
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();
Takže hlavní věci jsou $unset
operátor k odstranění stávajícího pole a $set
operátor k vytvoření nového pole v dokumentu. Potřebujete obsah dokumentu prozkoumat a použít jak "název pole" tak "hodnotu", takže proto to smyčkování, protože neexistuje žádný jiný způsob.
Pokud na serveru nemáte MongoDB 2.6 nebo vyšší, pak koncept smyčkování stále zůstává bez okamžitého přínosu pro výkon. Můžete se podívat na věci jako .eval()
za účelem zpracování na serveru, ale jak naznačuje dokumentace, opravdu se to nedoporučuje. Pokud musíte, používejte opatrně.