MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Aggiornamento del campo dei punti Mongodb

Ovviamente lo fa poiché questo è esattamente ciò che gli stai chiedendo di fare. Nonostante il titolo, non è possibile utilizzare "dot notation" qui affatto. Questo è ovviamente ciò che si desidera fare se si intende non sovrascrivere le proprietà esistenti. In questo momento stai solo sostituendo l'intero oggetto, nonostante l'uso di $set dove, a meno che tu non modifichi la struttura qui, è sostanzialmente ridondante.

Per "risolvere" questo problema, devi manipolare i tuoi data prima l'oggetto. Con qualcosa del genere:

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

Questo ti dà e l'output nel newobj struttura come questa:

{
    "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"
}

Quindi ovviamente puoi procedere con il tuo normale aggiornamento e fare tutto bene:

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

Ovviamente avresti bisogno di una ricorsione per una struttura più nidificata, ma questo dovrebbe darti un'idea generale. La notazione con i punti è la strada da percorrere, ma devi usarla effettivamente.