带Upsert的findOneAndUpdate总是插入一个新用户
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带Upsert的findOneAndUpdate总是插入一个新用户相关的知识,希望对你有一定的参考价值。
我想要做的是更新记录并插入它,如果它不存在与mongoose。这是我的代码:
module.exports.upsertUser = function(user) {
var options = {userName : 'Ricardo'}
Users.findOneAndUpdate({email: user.email}, options, {upsert:true}).exec();
}
和:
var promise = Users.upsertUser(user);
promise
.then(function(results){
...
}
.catch(function(err){
...
}
当我执行承诺时,每次使用相同的电子邮件创建新用户时。
我不确定我是否错误地执行了更新。我已经尝试过相同的方式,但有更新,它也无法正常工作。
你能帮助我吗?谢谢!
你需要在没有exec的情况下返回:
module.exports.upsertUser = function(user) {
var options = {userName : 'Ricardo'}
return Users.findOneAndUpdate({email: user.email}, options, {upsert:true, new: true});
}
var promise = Users.upsertUser(user);
promise.then(function(results){
if(results) {
console.log(results);
} else {
console.log('!results');
}
}.catch(function(err){
...
}
仅供参考:默认设置是返回未更改的文档。如果要返回新的更新文档,则必须使用upsert选项传递另一个参数:{new:true}。
根据你的编码,findOneAndUpdate()所做的是它找到你要编辑的这个文档/用户的文档,在这种情况下,你用来搜索你要编辑的这个用户的文档的文档是他的电子邮件。现在你的第二个参数修改了你要修改的文档部分,但是这个选项必须附加一些mongodb操作符(访问此链接获取它们的列表:https://docs.mongodb.com/manual/reference/operator/update/)但是在你的情况下你需要的是$ set operator.so我会像这样修改你的代码:
module.exports.upsertUser = function(user){var options = Users.findOneAndUpdate({email:user.email},{$ set:{userName:'Ricardo'}},{returnOriginal:true})。exec(); };
所以尝试上面的修改让我们看看它是如何工作的
以上是关于带Upsert的findOneAndUpdate总是插入一个新用户的主要内容,如果未能解决你的问题,请参考以下文章
(mongoose/promises) 如何检查文档是不是是使用 findOneAndUpdate 和 upsert 创建的
猫鼬 findOneAndUpdate Upsert _id null?
猫鼬 findOneAndUpdate 和 runValidators 不工作