我想在Meteor.js中为文档更新指定一个允许规则,该规则取决于更新的文档的属性。在update
回调中,我得到的是旧文档,已更改的顶级字段列表和Mongo修饰符。是否有一种简单的方法可以确定文档在更新后的外观?
一个非平凡的现实生活示例:我有一个Party
模型,其中maxCount
整数指定了参与聚会的人数,people
数组中包含名称参加的人用户可以将多个名称推送到该阵列。如果在结果文档中数组的长度不超过maxCount
,我想允许更新。
答案 0 :(得分:1)
这是一个完美的例子,说明为什么当前形式的允许/拒绝规则不足以解决大多数现实问题。任何文档都可以通过多种方式进行更新,使用允许/拒绝的工具检查所有文档是不切实际的。我说你只有在你的权限看起来如此时才应该使用它们:“文档的所有者可以随文档做任何事情。”
话虽如此,如果您真的希望使用上面的示例执行此操作,您可以尝试在people.length < maxCount
定义时检查modifier['$push']['people']
是否正确。
据我所知,这个问题的一般解决方案不存在。这就是我为所有数据库突变使用方法的原因。
您还可以查看simple-schema和collection2(我还没试过)。根据文档,简单模式可以在字段上定义min/max
时使用函数。我不清楚这是否意味着您可以根据要更新的对象动态定义min/max
。
答案 1 :(得分:0)
我不是这里的流星专家,但似乎有一种“强制执行”这种约束的基本方法。
对于大多数通知MongoDB的人来说,递增值的最“原子”方法是在$inc
语句中使用.update()
运算符。这样你确保当值“更新”时,“当前”值将“增加”设定值,并在更新时。
这里的问题显然在于强制执行“最大”约束。那么让我们说30
人。我知道很伤心的派对:
db.party.update(
{ "maxCount": { "$lt": 30 } },
{ "$inc": { "maxCount": 1 } }
})
因此,这应该作为“添加到派对”方法中的声明。您可以检查callback中的返回值(请参阅“numberUpdated”)以确保更新了某些内容或是否更新了内容。