sql >> データベース >  >> NoSQL >> MongoDB

MongoDBNode.jsネイティブドライバーはサイレントに`bulkWrite`例外を飲み込みます

    コメントしたように、「それはバグです」。具体的には、バグはここにあります

     // Return a Promise
      return new this.s.promiseLibrary(function(resolve, reject) {
        bulkWrite(self, operations, options, function(err, r) {
          if(err && r == null) return reject(err);
          resolve(r);
        });
      });
    

    問題は、「応答」(またはrPromiseでラップされているコールバック内 実際にはnullではありません 、したがって、エラーが存在するにもかかわらず、条件はtrueではありません。 およびreject(err) 呼び出されているのではなく、resolve(r) が送信されているため、これは例外とは見なされません。

    修正にはトリアージが必要ですが、writeErrorsを調べることで、前述のように「回避」することができます。 現在のbulkWrite()からの応答のプロパティ 実装するか、他の選択肢の1つを次のように検討します。

    Bulk APIメソッドを直接使用する:

    const MongoClient = require('mongodb').MongoClient,
          uri  = 'mongodb://localhost:27017/myNewDb';
    
    (async () => {
    
      let db;
    
      try {
    
        db = await MongoClient.connect(uri);
    
        let bulk = db.collection('myNewCollection').initializeOrderedBulkOp();
    
        bulk.find({ foo: 'bar' }).upsert().updateOne({
          $setOnInsert: { count: 0 },
          $inc: { count: 0 }
        });
    
        let result = await bulk.execute();
        console.log(JSON.stringify(result,undefined,2));
    
      } catch(e) {
        console.error(e);
      } finally {
        db.close();
      }
    
    })();
    

    完全に問題ありませんが、もちろん、バルクAPIサポートなしでサーバー実装を自然に回帰せず、代わりにレガシーAPIメソッドを使用するという問題があります。

    プロミスを手動でラップする

    (async () => {
    
      let db = await require('mongodb').MongoClient.connect('mongodb://localhost:27017/myNewDb');
    
      let mongoOps = [{
        updateOne: {
          filter: { foo: "bar" },
          update: {
            $setOnInsert: { count:0 },
            $inc: { count:1 },
          },
          upsert: true,
        }
      }];
    
      try {
        let result = await new Promise((resolve,reject) => {
    
          db.collection("myNewCollection").bulkWrite(mongoOps, (err,r) => {
            if (err) reject(err);
            resolve(r);
          });
        });
        console.log(JSON.stringify(result,undefined,2));
        console.log("Success!");
      } catch(e) {
        console.log("Failed:");
        console.log(e);
      }
    
    })();
    

    前述のように、問題はbulkWrite()の実装にあります。 Promiseとして返されます 。したがって、代わりにcallback()を使用してコーディングできます。 独自のPromiseを作成して実行します 期待どおりに動作するためのラッピング。

    繰り返しになりますが、例外を処理する正しい方法であるJIRAの問題とトリアージが必要です。しかし、うまくいけば、すぐに解決されます。それまでの間、上からアプローチを選択してください。




    1. あなたのビジネスに最適なMongoDBホスティングを選択する方法

    2. group by?のmongodb集約パイプラインでミリ秒を日付に変換しますか?

    3. 16mbサイズを超えるドキュメントのMongoDB回避策?

    4. 春のデータを使用してmongoでjsファイルを実行する方法