2017-09-23 16 views
1

私のcsvファイルからの入力に同じ電子メールアドレスを持つ2つ以上の行がある場合、findOneAndUpdateに関するいくつかの問題に直面しています。私のモデルでは電子メールアドレスが一意に設定されていて、findOneAndUpdateは私のCSVファイルで重複を処理できると思っていました。コードは以下のとおりです。 hereを読んでください。これは、クエリのフィールド(この場合は電子メール)が、レコードが見つからない場合に作成したいフィールドの1つでもあるからです。これが本当かどうかは分かりません。そして、どの場合でも電子メールは私の識別子なので、そこにいる必要があります。MongooseのfindOneAndUpdateとupsertの重複キーエラー

より多くの行動を説明するために:

  1. をcsvファイルは、すでに私は私のスクリプトを実行する前に、私は二つのレコードを持っている場合、findOneAndUpdateが、しかし完全に
  2. を作品にMongoDBに保存されている電子メールアドレスが含まれている場合同じメールアドレスが、この電子メールアドレスの無い記録を共有するcsvファイルは前のスクリプトを実行するにはMongoDBに格納され、(私は時々そう{ MongoError: E11000 duplicate key error collection: db.accounts index: email_1 dup key: { : "[email protected]" }
  3. のように重複キーエラーを取得する私は上記の理由時にはをを書いたもののレ私はしばしばそうです)私はそうではありません。

コード:あなたの助けを事前に

for (let i = 0; i < accounts.length; i++) { 
    let query = {'email': accounts[i].email}; 
    let accountHolderDoc = { 
     email: accounts[i].email, 
     name: { 
     first: accounts[i].accountHolderFName, 
     last: accounts[i].accountHolderLName, 
     }, 
    }; 

    promise = AccountHolder 
     .findOneAndUpdate(
      query, {$set: accountHolderDoc}, {upsert: true, new: true}) 
     .then(function(accountHolder) { ... }) 
     .catch(...); 
    ... 
} 

ありがとう!

答えて

0

This postは、存在しないドキュメントの検索と保存がアトミックではないことを示しています。つまり、検索と保存の間に同じクエリが見つからない可能性があります。唯一の解決策は、重複したキーエラーが処理された場合、たとえば、MongoDB操作を投げ捨てられた文書に再度適用することであるかどうかを確認することです。

私は今この解決方法に従います。誰かがこれを扱う異なる方法を持っているなら、私に知らせてください。ありがとう!

+0

私は、[async.eachSeries()](http://caolan.github.io/async)のループ処理に[async.js](http://caolan.github.io/async/)を使用することをお勧めします。 /docs.html#eachSeries)を使用して、一度に1つの操作を実行します。同期 'for'と非同期Mongooseを混在させることは、常に問題を引き起こす傾向があります。 – Mikey

関連する問題