验证多个mongoose文档并进行更新

时间:2018-03-29 09:54:26

标签: node.js validation mongoose mongoose-schema

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

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

通过这样做,我可以验证并插入/更新单个Offer文档。 到目前为止一直很好..

现在,我们要为多编辑Offer模型实现一项新功能。因此,我们的用户不必逐个更新具有相同值的相同字段。

请记住,我们期望在系统和理论上提供超过10k的优惠。用户可以使用此功能一次更新所有内容..

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

我们无法先进行查找,然后逐个验证。这需要很多时间。

有没有最佳方法来实现这一目标? 如果我必须改变我验证模型的方式,那就没问题。我对任何建议持开放态度。

1 个答案:

答案 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();
    });

作为一个想法,你可以将你的收藏分成多个流,并以这种方式并行运行,你可以获得很多时间,但诀窍是同步所有这些。