我需要定期从生产中备份mongo数据库的子集,并将其还原到开发数据库中,以便为特定客户诊断问题。考虑到数据库的大小,进行完整的备份/还原是不切实际的。
涉及几十个猫鼬模型,每个模型通常都通过Schema.ObjectId类型的字段对其他模型进行多次引用,并且我的实现在大多数情况下都有效,但是当备份大小超过10万条记录时,我还原时遇到内存不足的情况或数据库超时。
我的算法在异步循环内使用Model.insertMany(docs),一次将数百个文档插入到一个集合中,但是当涉及数十万个文档时,此过程不可避免地会消耗所有内存或超时dbase连接。 Process和Db mmory已最大化,并且我尝试将超时算法引入设施GC中,并尝试了批处理大小(一次从1000到一次到1),但是结果总是在非常大的数据集上失败。
如果我使用Model.connection.create(docs)而不是Model.insertMany(docs),则即使使用巨大的数据集,还原也能可靠地完成,但是备份中的ObjectID引用将作为字符串而不是ObjectID导入,并且无法通过猫鼬查询结果。
我知道批量插入是一个困难的场景,Mongoose正在对插入的每个文档进行验证等,但是对于备份/还原场景,由于目标db始终是src db的子集,因此不需要验证我想知道是否可以使用Model或Schema方法或其他技术将源文档转换为Mongoose文档?
我显然可以编写模型特定的方法来执行此转换,但是显然它也已经被猫鼬做了,我想知道该转换是否被任何api公开了?对于这种批量插入方案而言,这将是一个不错的中间立场技术。