2014-10-17 52 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