请参阅Meteor.js中允许/拒绝规则中的更新文档

时间:2014-03-21 11:37:22

标签: javascript node.js mongodb meteor

我想在Meteor.js中为文档更新指定一个允许规则,该规则取决于更新的文档的属性。在update回调中,我得到的是文档,已更改的顶级字段列表和Mongo修饰符。是否有一种简单的方法可以确定文档在更新后的外观?


一个非平凡的现实生活示例:我有一个Party模型,其中maxCount整数指定了参与聚会的人数,people数组中包含名称参加的人用户可以将多个名称推送到该阵列。如果在结果文档中数组的长度不超过maxCount,我想允许更新。

2 个答案:

答案 0 :(得分:1)

这是一个完美的例子,说明为什么当前形式的允许/拒绝规则不足以解决大多数现实问题。任何文档都可以通过多种方式进行更新,使用允许/拒绝的工具检查所有文档是不切实际的。我说你只有在你的权限看起来如此时才应该使用它们:“文档的所有者可以随文档做任何事情。”

话虽如此,如果您真的希望使用上面的示例执行此操作,您可以尝试在people.length < maxCount定义时检查modifier['$push']['people']是否正确。

据我所知,这个问题的一般解决方案不存在。这就是我为所有数据库突变使用方法的原因。

您还可以查看simple-schemacollection2(我还没试过)。根据文档,简单模式可以在字段上定义min/max时使用函数。我不清楚这是否意味着您可以根据要更新的对象动态定义min/max

答案 1 :(得分:0)

我不是这里的流星专家,但似乎有一种“强制执行”这种约束的基本方法。

对于大多数通知MongoDB的人来说,递增值的最“原子”方法是在$inc语句中使用.update()运算符。这样你确保当值“更新”时,“当前”值将“增加”设定值,并在更新时。

这里的问题显然在于强制执行“最大”约束。那么让我们说30人。我知道很伤心的派对:

db.party.update(
    { "maxCount": { "$lt": 30 } },
    { "$inc": { "maxCount": 1 } }
})

因此,这应该作为“添加到派对”方法中的声明。您可以检查callback中的返回值(请参阅“numberUpdated”)以确保更新了某些内容或是否更新了内容。