验证多个猫鼬文档并更新

Posted

技术标签:

【中文标题】验证多个猫鼬文档并更新【英文标题】:Validating multiple mongoose document and updating 【发布时间】:2018-09-08 05:33:45 【问题描述】:

我们有一个猫鼬模型Offer,它有一个名为activatedDateexpirationDate 的字段。

在预验证钩子中,如果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();
    );

作为一个想法,您可以将您的集合划分为多个流并并行运行它们,这样您可以获得大量时间,但诀窍是同步所有流。

【讨论】:

以上是关于验证多个猫鼬文档并更新的主要内容,如果未能解决你的问题,请参考以下文章

为啥猫鼬在更新时不验证?

为啥猫鼬在更新时不验证?

如何更新猫鼬中的多个文档?

如何更新猫鼬中的多个文档?

通过 id 集更新多个文档。猫鼬

使用猫鼬异步保存多个文档