我们有一个猫鼬模型Offer
,它有一个名为activatedDate
和expirationDate
的字段。
在预验证钩子中,如果expirationDate
小于activatedDate
,我的验证逻辑会抛出错误。 (这只是一个例子,我们有多个字段根据其他字段的记录值进行验证)
通过这样做,我可以验证并插入/更新单个Offer
文档。
到目前为止一直很好..
现在,我们要为多编辑Offer
模型实现一项新功能。因此,我们的用户不必逐个更新具有相同值的相同字段。
请记住,我们期望在系统和理论上提供超过10k的优惠。用户可以使用此功能一次更新所有内容..
只有在验证成功后才有更新多个mongoose文档的最佳方法吗?
我们无法先进行查找,然后逐个验证。这需要很多时间。
有没有最佳方法来实现这一目标? 如果我必须改变我验证模型的方式,那就没问题。我对任何建议持开放态度。
答案 0 :(得分:1)
创意1
我建议你将问题分为两部分:
首先使用某种parallel queue运行验证,以免遇到内存问题。
第二部分使用批量更新功能。
const bulk = Offer.collection.initializeOrderedBulkOp();
bulk.find(query).update(update);
bulk.execute(function (error) {
callback(); // done
});
创意2
使用streams
,mongoose支持cursor
和流,你可以安全地处理数据库中的所有行,内存使用将是不变的,但问题是它不快,它将按顺序迭代所有文档。一旦我处理了具有不同操作的2M记录集合并且花了大约40分钟,所以你肯定可以在这里优化。
Offer
.find()
.cursor()
.pipe(new Writable({
objectMode: true,
write(document, encoding, next) {
// do your validation logic
document.save(() => next());
},
}))
.on('finish', () => {
done();
});
作为一个想法,你可以将你的收藏分成多个流,并以这种方式并行运行,你可以获得很多时间,但诀窍是同步所有这些。