私のcsvファイルからの入力に同じ電子メールアドレスを持つ2つ以上の行がある場合、findOneAndUpdateに関するいくつかの問題に直面しています。私のモデルでは電子メールアドレスが一意に設定されていて、findOneAndUpdateは私のCSVファイルで重複を処理できると思っていました。コードは以下のとおりです。 hereを読んでください。これは、クエリのフィールド(この場合は電子メール)が、レコードが見つからない場合に作成したいフィールドの1つでもあるからです。これが本当かどうかは分かりません。そして、どの場合でも電子メールは私の識別子なので、そこにいる必要があります。MongooseのfindOneAndUpdateとupsertの重複キーエラー
より多くの行動を説明するために:
- をcsvファイルは、すでに私は私のスクリプトを実行する前に、私は二つのレコードを持っている場合、findOneAndUpdateが、しかし完全に
- を作品にMongoDBに保存されている電子メールアドレスが含まれている場合同じメールアドレスが、この電子メールアドレスの無い記録を共有するcsvファイルは前のスクリプトを実行するにはMongoDBに格納され、(私は時々そう
{ MongoError: E11000 duplicate key error collection: db.accounts index: email_1 dup key: { : "[email protected]" }
- のように重複キーエラーを取得する私は上記の理由時にはをを書いたもののレ私はしばしばそうです)私はそうではありません。
コード:あなたの助けを事前に
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(...);
...
}
ありがとう!
私は、[async.eachSeries()](http://caolan.github.io/async)のループ処理に[async.js](http://caolan.github.io/async/)を使用することをお勧めします。 /docs.html#eachSeries)を使用して、一度に1つの操作を実行します。同期 'for'と非同期Mongooseを混在させることは、常に問題を引き起こす傾向があります。 – Mikey