Mongoose查找,执行逻辑,然后在同一个集合上更新

时间:2018-02-24 16:23:12

标签: node.js angular mongodb mongoose

我需要查找文档,检查其字段的某些条件,然后根据条件的结果执行某项操作。这是在请求处理中,因此我必须根据结果返回响应中的不同内容。

我有一个使用findOneAndUpdate完成的解决方案,如果返回的记录为0,我会返回错误状态,但我很想知道以下为什么不起作用:

Users.findOne({'username':someVariable}).then((output)=>{

     if(output.someFiled > someCondition){
          Users.update(
              {'username':someVariable},
              {$set: {....}}
          ).then((error, num, success) =>{
              if(success){
                  return res.status(200).send('UPDATE OK');
              }
              if(error){
                  return res.status(500).....;
              }
          });
     } else {
         return res.status(404).....;
     }        

}).catch(....;

特别是find.then中的Users.update总是返回num:

{ ok: 0, n: 0, nModified: 0 }

这意味着虽然在第一个findOne中找到了记录,但没有找到任何记录。

编辑:关于库的更多信息,因为它可能是更新它们(来自package.json):

"bluebird": "^3.4.6",
"mongodb": "^3.0.2",
"mongoose": "^4.12.4",

谢谢,T。

2 个答案:

答案 0 :(得分:0)

您必须在(err,output)

中使用findOne
Users.findOne({'username':someVariable}).then((err,output)=>{

     if(output.someFiled > someCondition){
          Users.update(
              {'username':someVariable},
              {$set: {....}}
          ).then((error, num, success) =>{
              if(success){
                  return res.status(200).send('UPDATE OK');
              }
              if(error){
                  return res.status(500).....;
              }
          });
     } else {
         return res.status(404).....;
     }        

}).catch(....;

答案 1 :(得分:0)

发现问题:用户的模型文件没有我试图更新的字段。 "发现"如果模型没有声明这样的字段,那么部分也有效,但是"更新"部分赢了

所以,就像那样,应该阅读所有代码,但我认为这很无聊......从来没有幸运。