admin管理员组文章数量:1406926
I am facing some problems with findOneAndUpdate when the input ing from my csv file has two or more rows that have the same email address. Email address is set to unique in my model and I thought findOneAndUpdate would let me handle duplication in my csv file. The codes are below. Read here that it's because the fields in my query (in this case email) is also one of the fields I want to create in case the record is not found. I'm not sure if this is true. And in any case email is my identifier so it has to be in there.
To explain the behaviour more:
- When the csv file contains an email address that's already stored in MongoDB before I run my script, findOneAndUpdate works perfectly
- However, when I have two records in the csv file that share the same email address but no record of this email address is stored in MongoDB prior to running the script, I sometimes get a duplicate key error like so
{ MongoError: E11000 duplicate key error collection: db.accounts index: email_1 dup key: { : "[email protected]" }
- I wrote sometimes above because sometimes (although less often) I don't and everything works as it should be.
Codes:
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( ... );
...
}
I am facing some problems with findOneAndUpdate when the input ing from my csv file has two or more rows that have the same email address. Email address is set to unique in my model and I thought findOneAndUpdate would let me handle duplication in my csv file. The codes are below. Read here that it's because the fields in my query (in this case email) is also one of the fields I want to create in case the record is not found. I'm not sure if this is true. And in any case email is my identifier so it has to be in there.
To explain the behaviour more:
- When the csv file contains an email address that's already stored in MongoDB before I run my script, findOneAndUpdate works perfectly
- However, when I have two records in the csv file that share the same email address but no record of this email address is stored in MongoDB prior to running the script, I sometimes get a duplicate key error like so
{ MongoError: E11000 duplicate key error collection: db.accounts index: email_1 dup key: { : "[email protected]" }
- I wrote sometimes above because sometimes (although less often) I don't and everything works as it should be.
Codes:
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( ... );
...
}
Share
Improve this question
edited Dec 17, 2021 at 18:36
Henry Ecker♦
35.7k19 gold badges47 silver badges64 bronze badges
asked Sep 23, 2017 at 10:18
fabfab
4827 silver badges21 bronze badges
0
1 Answer
Reset to default 3This post suggests that searching for and saving a non-existing document are not atomic, which means between the searching and the saving, another query could have yielded a not found result for the same search criteria. The only solution then, it seems, is to ensure that if duplicate key errors are handled, for example, by reapplying MongoDB operations to the document that was thrown out.
本文标签: javascriptDuplicate key error in Mongoose39 findOneAndUpdate and upsertStack Overflow
版权声明:本文标题:javascript - Duplicate key error in Mongoose' findOneAndUpdate and upsert - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744984824a2636029.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论