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.