部分更新Mongo对象

4

我是一个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个回答

6

不要使用doc.$set.misc.updatedBy,请尝试使用以下代码:

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

在这里,我们使用MongoDB的点表示法来访问嵌套文档的属性。


示例:

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

r.update(id, doc);

1
昨天我再次查看时,发现$set设置了整个对象。我的做法是首先获取记录的对象数据,然后将未设置的对象属性拉入,手动添加到$set中,最后更新文档。多了5行代码,但完成了任务! - blueren
@blueren 是的,它确实可以,但根据情况,额外的数据库查找操作可能会非常昂贵。 - Soubhik Mondal
根据我的阅读,Meteor 中的附加查找操作是在客户端已经存在的 minimongo 实例中进行的。因此,它不应该对性能造成太大影响。 - blueren

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接