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

Posted

技术标签:

【中文标题】MongooseJS - 限制子文档中的文档数量【英文标题】:MongooseJS - limit number of documents in subdocument 【发布时间】:2017-08-12 02:47:10 【问题描述】:

我想知道是否有办法限制(子)文档中的元素数量。在我的应用程序中,可以使用 ajax 将元素添加到子文档中,因此防止恶意用户添加大量条目非常重要。

我可以想到一种方法,就是查询父文档,检查子文档的元素个数,如果小于X,就保存。然而,这需要查询整个文档,只是为了更新一些东西。我更喜欢用 update() 来做所有事情,而不是 findOne() 和 save()。有什么办法吗?

编辑:在更新之前无需数据库查找即可完成。我不知道是否可以使用 subdoc,我使用普通对象进行了操作。只需将数据存储在数组中,或者更好地存储在经典对象中。然后在更新之前验证密钥号,如果密钥号大于允许的 - 忽略它。 Ofc如果处理一个对象,首先检查key是否为数字。

【问题讨论】:

【参考方案1】:

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

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

其中MAX 是元素的最大数量,'message' 是验证失败时显示的消息。见:

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

但是,如果数组太长,您不能对 MongoDB 发出一个会失败的请求,因为 MongoDB 没有模式的概念,而您需要这样做。 Schema 仅存在于 Mongoose 中。

所以如果你想直接使用 MongoDB,那么你不仅不能在一个请求中完成,而且实际上比这更糟糕——你也不能消除竞争条件,因为 MongoDB 不支持事务,所以你不能真正保证永远不会超过您的限制。

【讨论】:

我完全不明白。假设我有一个子架构 childSchema 并且父架构就像 someVariable: String, child: type: [childSchema], validate: ... 那样工作吗?

以上是关于MongooseJS - 限制子文档中的文档数量的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 mongoosejs 返回子文档的 _id

mongodb 怎么限制文档数量

Mongoose 子文档排序

猫鼬引用子文档的不同方式?

Mongoosejs 刷新文档

Firebase Firestore 中一个集合下的文档数量限制