部分更新mongo对象

时间:2016-09-15 11:07:46

标签: javascript mongodb meteor javascript-objects 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")
    }
}

我已在我的meteor助手上编写代码,以便在每次更新时,只应将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不存在。更新文档中的部分对象的正确方法是什么?

2 个答案:

答案 0 :(得分: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 :(得分:0)

默认情况下,MongoDB更新命令将replace the document(s) entirely。要仅更新特定字段,请勿触摸匹配文档use the set operator in the MongoDB update command的其他字段。