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