验证多个猫鼬文档并更新
Posted
技术标签:
【中文标题】验证多个猫鼬文档并更新【英文标题】:Validating multiple mongoose document and updating 【发布时间】:2018-09-08 05:33:45 【问题描述】:我们有一个猫鼬模型Offer
,它有一个名为activatedDate
和expirationDate
的字段。
在预验证钩子中,如果expirationDate
小于activatedDate
,我的验证逻辑会抛出错误。 (这只是一个例子,我们有多个字段正在根据其他字段的记录值进行验证)
通过这样做,我可以验证和插入/更新单个 Offer
文档。
到目前为止一切顺利..
现在,我们要实现一个新功能来对Offer
模型进行多重编辑。这样我们的用户就不必一一更新具有相同值的相同字段..
请记住,我们预计系统和理论上的报价会超过 10k。用户可以使用此功能一次更新所有内容..
只有在我的验证成功后才更新多个猫鼬文档的最佳方法吗?
我们不能先查找,然后一个一个地验证它。这需要很多时间。
是否有最佳方式来实现这一目标? 如果我必须改变验证模型的方式,那也没关系。我愿意接受任何建议..
【问题讨论】:
【参考方案1】:想法 1
我可以建议你把问题分成两部分:
首先使用某种parallel queue 运行验证,以免遇到内存问题。
第二部分使用批量更新功能。
const bulk = Offer.collection.initializeOrderedBulkOp();
bulk.find(query).update(update);
bulk.execute(function (error)
callback(); // done
);
想法 2
使用streams
,猫鼬支持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();
);
作为一个想法,您可以将您的集合划分为多个流并并行运行它们,这样您可以获得大量时间,但诀窍是同步所有流。
【讨论】:
以上是关于验证多个猫鼬文档并更新的主要内容,如果未能解决你的问题,请参考以下文章