如何更新文档中的 Meteor 数组元素

How to update Meteor array element inside a document

我有一个 Meteor Mongo 文档,如下所示

{
    "_id" : "zFndWBZTvZPgSKXHP",
    "activityId" : "aRDABihAYFoAW7jbC",
    "activityTitle" : "Test Mongo Document",
    "users" : [
        {
            "id" : "b1@gmail.com",
            "type" : "free"
        },
                {
            "id" : "JqKvymryNaCjjKrAR",
            "type" : "free"
        },
    ],
}

我想使用如下所示的 Meteor 查询使用自定义生成的 ID 更新特定数组元素的电子邮件。

比如我要更新文档 如果 'users.id' == "b1@gmail.com" 然后将其更新为 users.id = 'SomeIDXXX'

所以更新后的文档应该如下所示。

{
    "_id" : "zFndWBZTvZPgSKXHP",
    "activityId" : "aRDABihAYFoAW7jbC",
    "activityTitle" : "Test Mongo Document",
    "users" : [
        {
            "id" : "SomeIDXXX",
            "type" : "free"
        },
        {
            "id" : "JqKvymryNaCjjKrAR",
            "type" : "free"
        },

    ],
}

我已经尝试了下面的但没有成功。

 Divisions.update(
      { activityId: activityId, "users.id": emailId },
      { $set: { "users": { id: _id } } }
    );

有人可以帮我解决相关的 Meteor 查询吗?谢谢 !

您需要使用 $push operator 而不是 $set。

{ $push: { <field1>: <value1>, ... } }

你的查询实际上几乎是正确的,除了一小部分我们想要通过其索引来识别要更新的元素。

Divisions.update({
"activityId": "aRDABihAYFoAW7jbC",
 "users.id": "b1@gmail.com"
}, {
$set: {"users.$.id": "b2@gmail.com"}
})

您可能需要 arrayFilters 选项。

Divisions.update(
  { activityId: activityId },
  { $set: { "users.$[elem].id": "SomeIDXXX" } },
  { arrayFilters: [ { "elem.id": "b1@gmail.com" } ], multi: true }
);

https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/