2

我有一个从客户端调用的 Meteor 方法,它依次更新单个文档中的所有字段。在下面的最后一行代码中,我尝试立即在客户端上运行相同的更新以获得直接的副作用(它假设更新将通过)。问题是我得到:

更新失败:访问被拒绝。在受限集合中,您只能更新文档,不能替换它们。使用 Mongo 更新运算符,例如 '$set'

当试图这样做时。我不想更新单个字段,我想更新整个文档。有没有办法正确地做到这一点?

entry = {
    title: title
    text: text
    tags: entry.tags
    mode: $('#mode').val()
    file_ids: entry.file_ids
}

eid = Session.get('entryId')
entry._id = eid if eid

context = Session.get('context')
Meteor.call('saveEntry', title, entry, context)
Entries.update({_id: entry._id}, entry)
4

1 回答 1

5

执行以下操作:

Entries.update({_id: entry._id}, { $set: entry })

典型的更新请求在以下表格中:

Collection.update(
   <query>,
   <update>
)

从 Mongodb 文档中,关于使用常规 key:value 对象进行更新:

完全替换文档

如果文档仅包含 field:value 表达式,则:

  • update() 方法用文档替换匹配的文档。update() 方法不会替换 _id 值。有关示例,请参阅替换所有字段。
  • update() 不能更新多个文档。

以及关于更新特定字段、使用$set$inc

更新特定字段

如果文档包含更新运算符表达式,例如使用 $set 运算符的表达式,则:

  • 文档必须仅包含更新运算符表达式。
  • update() 方法仅更新文档中的相应字段。例如,请参阅更新特定字段。

此外,据我所知,从您的错误消息 Meteor 不允许从客户端完全替换整个文档。所以一个选项是使用$set运算符并设置所有值,在这种情况下是整个文档本身。在将密钥传递给操作员之前,您通常可以跳过将_id密钥添加到文档中$set

于 2014-05-27T21:12:15.270 回答