【问题标题】:Meteor js, how to get side effect of updating whole client side documentMeteor js,如何获得更新整个客户端文档的副作用
【发布时间】:2014-07-16 20:23:49
【问题描述】:

我有一个从客户端调用的 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)

【问题讨论】:

  • 你能详细说明'saveEntry'方法吗?您可以将 update 作为该方法的一部分运行,这样可以避免您的问题。
  • 是的,你是对的......请参阅我在另一个答案下方添加的评论,这里的秘密是你提到的存根方法

标签: javascript mongodb meteor minimongo


【解决方案1】:

执行以下操作:

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 运算符。

【讨论】:

  • 不幸的是,特别是对于流星,您的解决方案似乎不起作用。 Minimongo 不支持它。我最终使用的解决方案是将我原来的 Entries.update 调用移动到名为 saveEntry 的客户端流星方法中。无论出于何种原因,如果您实际上从存根进行更新,它就可以工作。我不想不选择您的答案,所以如果您可以将此详细信息添加到您的解决方案中,我希望将您标记为正确。
  • 好的,我对你的理解正确吗,你将更新调用包装在 Meteor.methods() 中的一个方法中,如下所示:gist.github.com/anonymous/2387816
  • 有点......我的理解是你可以在服务器和客户端上都有 Meteor.methods。只要它在客户端 Meteor.method 中,就可以在客户端上进行完整的集合更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
相关资源
最近更新 更多