我有一个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)
答案 0 :(得分:5)
做类似的事情:
Entries.update({_id: entry._id}, { $set: entry })
典型的更新请求位于表单上:
Collection.update(
<query>,
<update>
)
从Mongodb文档中,关于使用常规键进行更新:值对象:
完全替换文档
如果文档仅包含field:value表达式,则:
- update()方法用文档替换匹配的文档。 update()方法不替换_id值。 有关示例,请参阅替换所有字段。
- update()无法更新多个文档。
以及使用$set
,$inc
等来更新特定字段:
更新特定字段
如果文档包含更新运算符表达式,例如使用$ set运算符的表达式,则:
- 文档必须只包含更新运算符表达式。
- update()方法仅更新文档中的相应字段。有关示例,请参阅更新特定字段。
此外,据我所知,从您的错误消息Meteor不允许从客户端完全替换整个文档。因此,一个选项是使用$set
运算符并设置所有值,在本例中是整个文档本身。在将文档传递给_id
运算符之前,您通常可以跳过将$set
键添加到文档中。