【问题标题】:Change name in collection with multiple documents in MongoDB and Meteor在 MongoDB 和 Meteor 中使用多个文档更改集合中的名称
【发布时间】:2026-01-14 11:15:02
【问题描述】:

如果我有一个包含多个文档的集合,例如:

{ FullName: "Jane Doe", Camp: "may12", Week1: "0", Week2: "1", Week3: "0" }
{ FullName: "Jane Doe", Camp: "may13", Week1: "0", Week2: "0", Week3: "1" }
{ FullName: "Jane Doe", Camp: "may14", Week1: "0", Week2: "1", Week3: "0" }

我需要将她的名字更新为“Jane Smith”,我从 Session 中得到她的名字:

var nameAddressFullName = Session.get('clientName');

获取所有带有她名字的文件放入一个数组中:

var documentNameAddressP = Programs.find({ FullName: nameAddressFullName}).fetch();

然后尝试更新所有名称(我只需要根据 _id 值进行更新),我需要类似:

Programs.update({ _id: {$in: {documentNameAddressP._id}}, {$set: {FullName: nameChange}}); //????

我们需要将 Jane Doe 的所有文档更新为全名 Jane Smith,以保持所有其余属性不变。

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

    如果您通过对服务器的方法调用进行此更新,那么您可以在更新查询中使用{multi: true} 一次性批量更新那里的所有文档。

    从客户端您可以轻松地遍历光标:

    Programs.find({ FullName: nameAddressFullName}).forEach(function(doc){
      Programs.update({ _id: doc._id },{ $set: { FullName: nameChange }});
    });
    

    【讨论】:

    • 谢谢弗洛伊德先生! 'multi' 选项是否需要在服务器上完成?
    • 是的,multi 仅适用于在服务器上执行的更新。
    【解决方案2】:

    您可以在更新查询中选择要更新的元素:

    Programs.update({FullName: nameAddressFullName},{$set: {FullName: nameChange}}) 
    

    https://docs.mongodb.org/manual/reference/operator/update/set/

    【讨论】:

    • 但是我只能根据_id更新一个文档的属性值。
    • 在 Meteor 中,这是出于安全目的。
    • 同理,从name获取id再用id更新,跟update by name有什么区别?