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

Mongodb-Punktfeldaktualisierung

Natürlich tut es das, denn das ist genau das, worum Sie es bitten. Trotz Ihres Titels wird "Punktnotation" hier überhaupt. Dies ist natürlich das, was Sie tun möchten, wenn Sie beabsichtigen, vorhandene Eigenschaften nicht zu überschreiben. Im Moment ersetzen Sie nur das gesamte Objekt, obwohl Sie $set wo, wenn Sie die Struktur hier nicht ändern, ist im Grunde überflüssig.

Um dies zu "reparieren", müssen Sie Ihre data manipulieren Objekt zuerst. Mit etwas in dieser Richtung:

var newobj = {};
Object.keys( data ).forEach(function(key) {
    if ( typeof(data[key]) == "object" ) {
       Object.keys( data[key] ).forEach(function(subkey) {
           newobj[key + "." + subkey] = data[key][subkey];
       });
    } else {
       newobj[key] = data[key];
    }
});

Das gibt Ihnen und die Ausgabe im newobj Struktur wie folgt:

{
    "postcode" : "BV123456789BY",
    "status.last_check" : 1413539153572,
    "status.code" : "06",
    "status.postnum" : "247431",
    "status.date" : ISODate("2014-10-17T11:28:20.540Z"),
    "status.text" : "06. Поступило в участок обработки почты (247431) Светлогорск - 1"
}

Dann können Sie natürlich mit Ihrem normalen Update fortfahren und alles richtig machen:

Order.update({ "postcode": newobj.postcode}, { "$set": newobj }, function (err) {
    if (err) console.log(err);
});

Natürlich würden Sie für eine stärker verschachtelte Struktur eine gewisse Rekursion benötigen, aber dies sollte Ihnen die allgemeine Vorstellung vermitteln. Die Punktnotation ist der richtige Weg, aber Sie müssen sie tatsächlich verwenden.