【问题标题】:Insert multiple records in mongodb with nodejs mongodb driver and async.js使用nodejs mongodb驱动程序和async.js在mongodb中插入多条记录
【发布时间】:2017-11-29 10:44:41
【问题描述】:

目前我在尝试使用 nodejs 驱动程序在 mongodb 中执行一些条目时面临回调地狱。只有在插入所有记录(在数组中)时才应该执行某些任务。 我查看了async.each method 但主要问题是如果遇到错误,它将调用回调。因此不会处理集合中的其余项目。

那么用 async.js 处理这类问题的正确方法是什么?

PS:请举个例子会很有帮助,因为我刚开始使用 async.js,而且很少(如果有的话)使用这个 API 批量插入到 mongodb 的例子。

【问题讨论】:

  • 异步是一种糟糕/过时的方法。您应该改用 Promise。插入相同类型的多条记录的最佳方法是通过单个多行插入。这是 PostgreSQL 的示例:stackoverflow.com/questions/37300997/…。您需要为 mongodb 找到相同的内容。
  • @vitaly-t 我认为这只是一种意见。谷歌搜索回调地狱会产生 asyncjs 作为一种非常流行的解决方案。目前我更喜欢使用 async.js
  • @rahulserver 因此,如果您有 10 次插入要做,并且在迭代 #6 时出现错误,应该发生什么?删除前一个元素(#1 到 #5)?继续下一个(#7 到 #10)?还是停在这里(#6到#10没有插入)但是不运行final函数中的代码()?
  • @DanieleTassone 最好将结果收集到 #6 失败的数组中,然后继续下一个
  • 我通常使用 Promise 来避免导致应用程序运行异常的“崩溃”场景。我的建议是在 Async 函数中使用基于 Promise 的方法或 Try/Catch(我个人不喜欢 Try/Catch)。对于异步内部使用的 MongoDB,我通常在 OrderedBulk 中批量处理所有插入/更新。然后我在异步流程结束时提交。我不知道这是否是您想要的回复类型。如果是这样,我可以给你一个完整的回复。

标签: javascript node.js mongodb asynchronous async.js


【解决方案1】:

让我们描述一下问题。

  1. 您有一个基于迭代的流程,其中包含一些库(例如:AsyncJS)
  2. 异步流可能在某些迭代中被中断
  3. 您希望确保 MongoDB 中的所有操作都正确存储 或者如果该操作应该发生或不发生,可能会做出未来的决定

在这种情况下,我可以建议您使用批量操作

 // array of operations
 let batch = yourCollection.initializeUnorderedBulkOp();

 async.each (yourArrayToIterate, function (item, next) {
     // add some Operation that will be execute lated
     batch.insert({firstName:"Daniele"});
     batch.find({firstName: "Daniele"}).updateOne({$set: {lastName:"Tassone"}});
     // other code to do...some Old Library
       try {
         someOldLibrary.doSomethingThatCanCreateAnExpection();
      } catch (e) {
         //some error happen
      }
     // more modern approach with New Library
      someNewLibrary
       .then(function (result){
       })
       .catch(function (err) {
           // some error happen
       }

 }, function (err, result) {

      // Flow is now completed, take a decision
     if (err) {
       // do nothing, maybe?
     } else {
        // execute all the Ordered Bulk 
        batch.execute().then(function(executionResult) {
            // done, you can 
        });
     }
 });

一些注意事项: 1) BulkOperation 可以是有序的和无序的。 UnOrdered 性能更好,即使发生一些错误也能继续工作 2) Ordered 是按顺序执行的,如果发生错误,MongoD 将不会继续到 Bulk 中的下一个元素。

文档: http://mongodb.github.io/node-mongodb-native/2.0/api/Collection.html#initializeOrderedBulkOp

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2013-04-03
    相关资源
    最近更新 更多