Samozřejmě to dělá, protože to je přesně to, co po něm požadujete. Navzdory vašemu titulu se zde nepoužívá "tečková notace" tady vůbec. To je samozřejmě to, co chcete udělat, pokud nechcete přepsat existující vlastnosti. Právě teď nahrazujete celý objekt, přestože používáte $set
kde pokud zde nezměníte strukturu, je v podstatě nadbytečné.
Chcete-li to "opravit", musíte manipulovat se svými data
objekt jako první. S něčím v tomto smyslu:
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];
}
});
To vám dává a výstup v newobj
struktura takto:
{
"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"
}
Pak můžete samozřejmě pokračovat ve své normální aktualizaci a vše v pořádku:
Order.update({ "postcode": newobj.postcode}, { "$set": newobj }, function (err) {
if (err) console.log(err);
});
Samozřejmě byste potřebovali nějakou rekurzi pro více vnořenou strukturu, ale to by vám mělo poskytnout obecnou představu. Tečkovaná notace je správná cesta, ale musíte ji skutečně používat.