1

我有一個蒙戈文件看起來像這樣:我的流星幫手部分更新蒙戈對象

{ 
    "_id" : "cfqjJW8WZprDSJEop", 
    "rName" : "z1", 
    "pName" : "P-4", 
    "ipAddress" : "21.1.1.12", 
    "misc" : { 
     "createdBy" : "admin", 
     "updatedBy" : "admin", 
     "creationTime" : ISODate("2016-09-15T09:43:10.953Z"), 
     "updatedTime" : ISODate("2016-09-15T09:43:10.953Z") 
    } 
} 

我已經寫代碼,這樣每次更新過程中,只有updatedByupdatedTime應該被推到mongo文件。

misc對象是在插入/更新之前添加的東西。

我遇到麻煩時,我嘗試使用更新的記錄:

doc // contains the update document being generated. 
misc = {}; 
misc.updatedBy = //some name 
misc.updatedTime = new Date(); 

doc.misc = misc, 

r.update(id,doc); // calling meteor update 

然而,當更新發生的,正在發生的事情是,查詢被完全替換記錄中的其它對象(即包含createdBy和creationTime)與我已經通過。我最終失去了creationTime和createdBy字段。

如何部分更新對象?

由於我的文檔對象最初不包含其它對象,我也嘗試過的東西注入,如:

doc.$set.misc.updatedBy 

但出現了錯誤,指出updatedBy不存在。更新文檔中的部分對象的正確方法是什麼?

回答

2

而不是doc.$set.misc.updatedBy

試試這個:

doc = { 
    "$set": { 
     "misc.updatedBy": "some data" 
    } 
}; 

這裏我們使用MongoDB的Dot Notation訪問嵌入文檔的屬性。


實施例:

var doc = { 
    "$set": { 
     "misc.updatedBy": "some data", 
     "misc.updatedTime": new Date(), 
    } 
}; 

r.update(id, doc); 
+1

雖然我昨天又看了這個,我注意到$ set是設置整個對象。我所做的是首先獲取記錄的對象數據,然後引入那些未設置的對象屬性,手動將它們添加到$ set,然後更新文檔。額外5行代碼,但完成這項工作! – blueren

+0

@blueren是的,但額外的數據庫查找操作可能會非常昂貴,具體取決於情況。 –

+0

從我讀到的,流星中的additioanal查找操作發生在已存在於客戶端的minimongo實例中。所以它不應該是太多的性能影響。 – blueren