MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB:So benennen Sie ein Feld mit Regex um

Dies ist keine mapReduce-Operation, es sei denn, Sie möchten eine neue Sammlung, die nur aus der _id besteht und value Felder, die aus der mapReduce-Ausgabe erzeugt werden, ähnlich wie:

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

Was bestenfalls eine Art "serverseitige" Überarbeitung Ihrer Sammlung ist, aber natürlich nicht in der gewünschten Struktur.

Obwohl es Möglichkeiten gibt, den gesamten Code auf dem Server auszuführen, versuchen Sie dies bitte nicht, es sei denn, Sie sind wirklich an der richtigen Stelle. Diese Methoden funktionieren im Allgemeinen sowieso nicht gut mit Sharding, was normalerweise der Punkt ist, an dem die Leute wegen der schieren Größe von Datensätzen „wirklich in Schwierigkeiten sind“.

Wenn Sie Dinge ändern und dies in großen Mengen tun möchten, müssen Sie im Allgemeinen die Erfassungsergebnisse „schleifen“ und die Aktualisierungen verarbeiten, während Sie Zugriff auf die aktuellen Dokumentinformationen haben. Das heißt, wenn Ihre „Aktualisierung“ auf Informationen „basiert“, die bereits in Feldern oder der Struktur des Dokuments enthalten sind.

Es ist daher keine "Regex-Ersetzung"-Operation verfügbar, und es gibt sicherlich keine zum Umbenennen eines Felds. Machen wir also eine Schleife mit Massenoperationen für die "sicherste" Form, dies zu tun, ohne den gesamten Code auf dem Server auszuführen.

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

Die wichtigsten Dinge sind also $unset -Operator, um das vorhandene Feld und den $set -Operator, um das neue Feld im Dokument zu erstellen. Sie benötigen den Dokumentinhalt, um sowohl den "Feldnamen" als auch den "Wert" zu untersuchen und zu verwenden, daher die Schleife, da es keinen anderen Weg gibt.

Wenn Sie MongoDB 2.6 oder höher nicht auf dem Server haben, bleibt das Schleifenkonzept weiterhin ohne unmittelbaren Leistungsvorteil. Sie können sich Dinge ansehen wie .eval() um auf dem Server zu verarbeiten, aber wie die Dokumentation vermuten lässt, wird es wirklich nicht empfohlen. Verwenden Sie es mit Vorsicht, wenn es sein muss.