MongooseJS - 限制子文档中的文档数量

3

我在想是否有一种方法来限制(子)文档中元素的数量。在我的应用程序中,可以使用ajax向子文档添加元素,因此防止恶意用户添加过多的条目非常重要。

我能想到的一种方法是查询父文档,检查子文档中的元素数量,如果少于X,则保存它。但这需要查询整个文档,只是为了更新一个小东西。我更喜欢使用update()做所有事情,而不是findOne()和save()。有没有办法呢?

编辑:可以在更新之前完成而无需进行数据库查找。我不知道是否可以在子文档中完成,但我用一个普通对象完成了它。只需将数据存储在数组或更好的经典对象中。然后在更新之前验证键的数量,如果键号大于允许的数字-请忽略它。当然,如果处理的是对象,请先检查键是否为数字。

1个回答

2

您可以使用自定义的validate函数在Mongoose中设置数组限制,示例如下:

validate: [v => v.length <= MAX, 'message']

这里,MAX 是元素的最大数量,'message' 是在验证失败时显示的信息。详情请参见:

http://mongoosejs.com/docs/api.html#schematype_SchemaType-validate

但是,如果你直接使用 MongoDB,就不能一次性发出一个会失败的请求,因为 MongoDB 没有模式的概念,而这是必需的。模式只存在于 Mongoose 中。

因此,如果您想直接使用 MongoDB,不仅无法在一次请求中完成,而且情况比这更糟——您也无法消除竞态条件,因为 MongoDB 不支持事务,所以不能真正保证您的限制不会超过最大值。


我不是很理解。假设我有一个子模式childSchema,而父模式如下:{ someVariable: String, child: { type: [childSchema], validate: { ... } } } 这样行得通吗? - Maciej Krawczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接