我在Mongo中有以下架构:
var OrderSchema = new Schema({
postcode: String,
...
status: {
last_check: { type: Date },
date: Date,
code: String,
postnum: String,
text: String,
class: String
},
});
我有一个保存数据的功能(旧方法已注释):
function save_order(data) {
// var order = new Order(data);
// var upsertData = order.toObject();
// delete upsertData._id;
// Order.findOneAndUpdate({postcode: order.postcode}, upsertData, {upsert: true}, function (err) {
Order.update({postcode: data.postcode}, {$set:data}, function (err) {
if (err) console.log('err');
});
}
这里传递给函数的数据示例:
{ postcode: 'BV123456789BY',
status:
{ last_check: 1413539153572,
code: '06',
postnum: '247431',
date: Thu Oct 16 2014 09:52:00 GMT+0300 (Восточная Европа (лето)),
text: '06. Поступило в участок обработки почты (247431) Светлогорск - 1' } }
设置status.class的功能正常 - 它不会覆盖状态:
function setByOrderId(id, data) {
// data = {'status.class': 'danger'}
Order.update({_id: id}, {$set: data}, function (err) {
if (err) console.log('err');
});
}
问题是当我更新状态时,status.class的值消失了...... 如何在不覆盖status.code的情况下更新状态?谢谢。
答案 0 :(得分:1)
当然它确实如此,因为这正是你要求它做的。尽管你的头衔,但在这里根本没有使用"dot notation"。如果您不打算覆盖现有属性,这当然是您想要做的。现在你只是替换整个对象,尽管你使用了$set
,除非你在这里更改结构基本上是多余的。
To" fix"这个,你需要先操纵你的data
对象。有这些方面的东西:
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];
}
});
这会在newobj
结构中为您提供输出,如下所示:
{
"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"
}
当然,您可以继续正常更新并完成所有事情:
Order.update({ "postcode": newobj.postcode}, { "$set": newobj }, function (err) {
if (err) console.log(err);
});
当然,对于更嵌套的结构,你需要一些递归,但这应该给你一般的想法。点符号是要走的路,但你需要实际使用它。