Tất nhiên nó làm được vì đây chính xác là những gì bạn đang yêu cầu nó làm. Bất chấp tiêu đề của bạn, không được sử dụng "ký hiệu dấu chấm" ở đây chút nào. Tất nhiên đây là những gì bạn muốn làm nếu bạn có ý định không ghi đè các thuộc tính hiện có. Ngay bây giờ, bạn chỉ đang thay thế toàn bộ đối tượng, mặc dù bạn đang sử dụng $set
nơi trừ khi bạn thay đổi cấu trúc ở đây về cơ bản là thừa.
Để "khắc phục" điều này, bạn cần thao tác data
của mình đối tượng đầu tiên. Với một cái gì đó dọc theo những dòng sau:
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];
}
});
Điều đó cung cấp cho bạn và đầu ra trong newobj
cấu trúc như thế này:
{
"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"
}
Sau đó, tất nhiên, bạn có thể tiếp tục cập nhật bình thường của mình và làm mọi thứ ổn:
Order.update({ "postcode": newobj.postcode}, { "$set": newobj }, function (err) {
if (err) console.log(err);
});
Tất nhiên bạn sẽ cần một số đệ quy cho một cấu trúc lồng nhau hơn, nhưng điều này sẽ cung cấp cho bạn ý tưởng chung. Ký hiệu dấu chấm là một cách để thực hiện, nhưng bạn cần thực sự sử dụng nó.