部分更新 mongo 对象

blu*_*ren 3 javascript mongodb javascript-objects meteor meteor-autoform

我有一个看起来像这样的 mongo 文档:

{
    "_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")
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经在我的流星助手上编写了代码,这样在每次更新期间,只有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
Run Code Online (Sandbox Code Playgroud)

但是,当更新发生时,发生的事情是查询完全用我传递的内容替换了记录中的 misc 对象(包含 createdBy 和 creationTime)。我最终失去了 creationTime 和 createdBy 字段。

我该如何部分更新对象?

由于我的 doc 对象最初不包含 misc 对象,因此我也尝试注入以下内容:

doc.$set.misc.updatedBy 
Run Code Online (Sandbox Code Playgroud)

但它错误地指出updatedBy 不存在。更新文档中的部分对象的正确方法是什么?

Bla*_*zen 5

代替 doc.$set.misc.updatedBy

尝试这个:

doc = {
    "$set": {
        "misc.updatedBy": "some data"
    }
};
Run Code Online (Sandbox Code Playgroud)

这里我们使用 MongoDBDot Notation来访问嵌入文档的属性。


例子:

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

r.update(id, doc);
Run Code Online (Sandbox Code Playgroud)