Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 具有Upsert的findOneAndUpdate始终插入新用户_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 具有Upsert的findOneAndUpdate始终插入新用户

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(); } 以及: 当我履行承诺时,每次都会使用相同的电子邮件创建一个新用户 我不确定是否执行了

我想做的是更新一条记录,如果mongoose不存在,就插入它。这是我的密码:

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