2016-06-13 7 views
3

コードは、文書がDBに存在するかどうか(プリセーブフックを使用)をチェックし、存在しない場合は挿入します。それは正常に動作しますが、最初のドキュメントでは機能しません。常に挿入されます。この最初のドキュメントは、事前セーブフックを起動しないようです。mongoose常に最初の文書を挿入して、事前保存フックをスキップする

Model = require('./model') 
var model = new Model(); 

//Before saving, check if the product exists 
Model.schema.pre('save', function (next) { 
    var self = this; 
    Model.findOne({apiProductId: self.apiProductId}, function (err, product) { 
     if (!product) { 
      next(); 
     } 
     else { 
      next(new Error("Product exists: " + self.apiProductId)); 
     } 
    }); 
}); 

model.save(function (err, document) { 
    if (err) { 
     console.log(err); 
    } 
     else { 
      console.log('Inserted: ' + document.apiProductId); 
     } 
}); 
+0

mongoの** _ upsert _ **機能は役に立ちますか?たぶんこの[stackoverflowスレッド](http://stackoverflow.com/questions/9661081/mongoose-update-upsert)いくつかを明確にすることができます。 – FlorianE

答えて

1

事前保存フックは重複を避ける正しい方法ではありません。 findOneAndUpdateを使用してください。

あなたの問題があることができます:フックの実行順序は、あなたがapiProductIdにまばらなインデックスを作成している

  • 予測不可能であり、あなたがnull値をチェックしている:あなたが非同期的に複数のドキュメントを保存しようとしている

  • 関連する問題