部分更新 mongo 对象

Partially updating a mongo object

我有一个 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")
    }
}

我在我的流星助手上写了代码,这样在每次更新期间,只有 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

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

如何部分更新对象?

由于我的 doc 对象最初不包含 misc 对象,我也尝试注入类似 :

doc.$set.misc.updatedBy 

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

而不是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);

默认情况下 MongoDB 更新命令将 replace the document(s) entirely. To only update a specific field and don't touch the other fields of the matching documents use the set operator in the MongoDB update command