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

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

在预验证钩子中,如果expirationDate 小于activatedDate,我的验证逻辑会抛出错误。 (这只是一个例子,我们有多个字段正在根据其他字段的记录值进行验证)

通过这样做,我可以验证和插入/更新单个 Offer 文档。 到目前为止一切顺利..

现在,我们要实现一个新功能来对Offer 模型进行多重编辑。这样我们的用户就不必一一更新具有相同值的相同字段..

请记住,我们预计系统和理论上的报价会超过 10k。用户可以使用此功能一次更新所有内容..

只有在我的验证成功后才更新多个猫鼬文档的最佳方法吗?

我们不能先查找,然后一个一个地验证它。这需要很多时间。

是否有最佳方式来实现这一目标? 如果我必须改变验证模型的方式,那也没关系。我愿意接受任何建议..

【问题讨论】:

    标签: node.js validation mongoose mongoose-schema


    【解决方案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();
        });
    

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

    【讨论】:

      猜你喜欢
      • 2020-10-18
      • 2011-10-05
      • 2013-12-04
      • 2020-06-27
      • 2018-08-20
      • 1970-01-01
      • 2020-02-16
      • 2016-05-24
      • 2020-09-14
      相关资源
      最近更新 更多