我想做的就是更新一条记录,如果猫鼬不存在,请插入一条记录。这是我的代码:
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){
...
}
执行承诺时,每次使用相同的电子邮件创建一个新用户。
我不确定是否执行错误更新。我已经用相同的方法尝试过,但是使用了更新,它也不起作用。
你能帮我吗?谢谢!
答案 0 :(得分:0)
根据您的编码,findOneAndUpdate()的作用是找到要编辑的该文档/用户文档,在这种情况下,您用来搜索要编辑的该用户文档的文档是和他的电子邮件。现在,您的第二个参数修改了您想要修改的文档部分,但是此选项必须附加在一些mongodb运算符上(请访问此链接以获取它们的列表:https://docs.mongodb.com/manual/reference/operator/update/),但在您情况下您需要的是 $ set 运算符。因此,我将像这样修改您的代码:
module.exports.upsertUser =函数(用户){ var options = Users.findOneAndUpdate({email:user.email},{$ set:{ userName:“里卡多” }},{ returnOriginal:true})。exec(); };
所以尝试上面的修改,让我们看看它是如何工作的
答案 1 :(得分:0)
您需要在没有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}。