findOneAndUpdate 与 Upsert 总是插入一个新用户



我想做的是更新一条记录,如果猫鼬不存在,请插入它。这是我的代码:

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){
...
}

当我执行承诺时,每次使用相同的电子邮件创建新用户时。

我不确定我是否错误地执行了更新。我已经以相同的方式尝试过它,但进行了更新,但它也不起作用。

你可以帮我吗?谢谢!

您需要在没有执行的情况下输入返回:

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){
...
}

仅供参考: 默认值是返回未更改的文档。如果要返回新的、更新的文档,则必须传递一个附加参数:{new:true} 和 upsert 选项。

根据您的编码,findOneAndUpdate((的作用是找到您正在寻找的该文档/用户的文档以进行编辑,在这种情况下,您正在使用该文档来搜索要编辑的该用户的文档是使用他的电子邮件。现在,您的第二个参数修改了要修改的文档部分,但是此选项必须附加一些mongodb运算符(请访问此链接以获取它们的列表:https://docs.mongodb.com/manual/reference/operator/update/(,但是在您的情况下,您需要的是$setoperator.so 我会像这样修改您的代码:

module.exports.upsertUser = function(user( { 变量选项 = Users.findOneAndUpdate({email: user.email}, {$set:{ 用户名 : '里卡多' }}, { returnOriginal: true}(.exec((; };

所以尝试上面的修改,让我们看看它是如何工作的

最新更新