Meteor开发平台入门 互动版

更新文档 - Collection.update

使用集合对象的update(selector,modifier,[options],[callback])方法更新 集合中指定的文档。

下面的示例更新persons集合中名为Json的第一个文档记录,设置其积分为100:

var demp = new Mongo.Collection("persons");
demo.update({name:"Jason"},{$set:{score:100}})

≡ 使用方法

update()方法的参数如下:

  • selector - 文档选择符,可以是文档id或合法的MongoDB选择符
  • modifier - 文档修改指令对象,update方法将根据这个指令修改匹配的数据
  • options - 可选参数是一个JSON对象,影响update操作的行为
  • callback - 指定回调函数function(error,nums){...},在更新完成后被调用。

后端调用该方法时,如果不指定callback参数,将阻塞执行直至更新完成,或者在发生 错误时抛出异常;前端不支持同步阻塞方式的执行,因此如果不设置callback参数,将 无法捕捉错误和执行结果。

≡ 更新所有符合条件的文档

默认情况下,update()方法仅仅更新匹配选择条件的第一个文档,通过设置参数options 对象的multi属性为true,可以使update()方法更新匹配选择条件的所有文档。 下面的示例可以更新persons集合中名为Json的所有文档记录,设置其积分为100:

var demp = new Mongo.Collection("persons");
demo.update({name:"Jason"},{$set:{score:100},{multi:true}})

≡ 在没有匹配文档时执行插入操作

默认情况下,update()方法如果找不到匹配选择条件的文档,将不会执行任何修改操作。通过 设置参数options对象的upsert属性为true,可以使update()方法在无法找到匹配文档时, 执行插入操作。下面的示例将使用指定的文档更新contacts集合中名为Json的第一个文档记录, 如果找不到的话就插入指定的文档:

var demo = new Mongo.Collection("contacts");
demo.update({name:"Jason"},{name:"Jason",tel:"114"},{upsert:true});

≡ 受信代码与非受信代码

update()方法的行为取决于是在受信代码中被调用,还是在非受信代码中被调用。服务端 代码被认为是受信代码,而浏览器中运行的客户端代码被认为是非受信代码。

在受信代码中,可以设置options参数的multi属性来一次更新多个文档,然而在非受信 代码中,只可以是使用文档的_id作为选择符,一次更新一个文档,而且还必须通过应用层 设置的allow和deny规则检查。此外,非受信代码中调用的update()方法,也不能执行通过 设置options参数的upsert属性来执行无匹配时的插入操作 —— 除非在应用中添加了insecure包。

执行以下命令复位test应用、删除源文件:

~/test$ meteor reset↵ ~/test$ rm -rf \*↵

执行以下方法拷贝col-update示例代码、运行并查看运行结果:

~/test$ cp ~/demos/col-update/* .↵ ~/test$ meteor↵

理解并修改col-update示例代码,通过练习掌握Collection对象在前端和后端执行 的差异。