Node.js 具有Upsert的findOneAndUpdate始终插入新用户
我想做的是更新一条记录,如果mongoose不存在,就插入它。这是我的密码:Node.js 具有Upsert的findOneAndUpdate始终插入新用户,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我想做的是更新一条记录,如果mongoose不存在,就插入它。这是我的密码: module.exports.upsertUser = function(user) { var options = {userName : 'Ricardo'} Users.findOneAndUpdate({email: user.email}, options, {upsert:true}).exec(); } 以及: 当我履行承诺时,每次都会使用相同的电子邮件创建一个新用户 我不确定是否执行了
module.exports.upsertUser = function(user) {
var options = {userName : 'Ricardo'}
Users.findOneAndUpdate({email: user.email}, options, {upsert:true}).exec();
}
以及:
当我履行承诺时,每次都会使用相同的电子邮件创建一个新用户
我不确定是否执行了错误的更新。我也用同样的方法尝试过,但是用了update,它也不起作用
你能帮我吗?谢谢 根据您的编码,findOneAndUpdate()的作用是查找您要编辑的此文档/用户文档,在本例中,您用来搜索您要编辑的此用户文档的是他的电子邮件。现在,您的第二个参数修改了您想要修改的文档部分,但此选项必须附加一些mongodb操作符(访问此链接获取它们的列表:),但在您的情况下,您需要的是$set操作符。因此,我将修改您的代码如下: module.exports.upsertUser=函数(用户){ 变量选项= Users.findOneAndUpdate({email:user.email},{$set:{ 用户名:“Ricardo” }}, { returnOriginal:true}).exec(); };
因此,请尝试上面的修改,让我们看看它是如何工作的您需要在不使用exec的情况下放置return:
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}。请参见此处的答案:
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){
...
}