Naturligtvis gör den det eftersom det är precis vad du ber den att göra. Trots din titel finns det ingen användning av "dot notation" här överhuvudtaget. Detta är naturligtvis vad du vill göra om du tänker inte skriva över befintliga egenskaper. Just nu byter du bara ut hela objektet, trots din användning av $set
där om du inte ändrar strukturen här är i princip överflödig.
För att "fixa" detta måste du manipulera dina data
objekt först. Med något i den här stilen:
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];
}
});
Det ger dig och utdata i newobj
struktur så här:
{
"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"
}
Sedan kan du naturligtvis fortsätta med din vanliga uppdatering och få allt rätt:
Order.update({ "postcode": newobj.postcode}, { "$set": newobj }, function (err) {
if (err) console.log(err);
});
Naturligtvis skulle du behöva lite rekursion för en mer kapslad struktur, men detta borde ge dig den allmänna uppfattningen. Punktnotering är rätt väg att gå, men du måste faktiskt använda den.