我正在尝试对预先存在的集合运行mongoose模式验证。使用mongoose创建集合,因此文档通常是正确的,但如果模式以某种方式更改,添加/删除字段,更改类型等等。我必须编写脚本以手动对集合进行更改。
我认为更灵活/可重用的解决方案是在整个集合中运行模式验证。然而,这似乎并不像我想象的那么容易。
我的问题是,目前,验证运行的唯一时间是文档创建和使用save()
方法的更新。保存注入$set
,使其不会覆盖文档,只验证正在写入的字段。因此,例如,如果字段foo
已从字符串更改为默认值为0的数字,则需要找到包含foo
中字符串的所有文档并将其设置为默认值。
我正在检索所有文档,迭代每个文档并调用.save()
,如果存在类型错误,我使用err.path
删除有问题的字段并尝试再次保存,重复使用没有错误。我认为肯定会将任何与模式不匹配的字段设置为默认值,但save()
不会覆盖文档,因此如果数据库中存在某个字段但未保存的文档中存在该字段,则会离开它一个人没有任何反应。
mongooses更新方法有一个覆盖选项,但更新没有运行验证,所以我被卡住了。