2014-10-17 48 views
1

我在蒙戈以下模式:MongoDB的点域更新

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?谢谢。

回答

1

当然,因为这正是你要求它做的。尽管你的头衔,这里根本没有"dot notation"的用法。这当然是你想要做的,如果你打算不覆盖现有的属性。现在你只是更换整个对象,尽管你使用了$set,除非你改变这里的结构基本上是多余的。

要“解决”这个问题,您需要先操作您的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); 
}); 

当然,你会需要一些递归更多的嵌套结构,但这应该给你一般的想法。点符号是要走的路,但你需要实际使用它。

+0

谢谢!有用! – 2014-10-17 12:40:51