猫鼬 findOne,更新和执行

Posted

技术标签:

【中文标题】猫鼬 findOne,更新和执行【英文标题】:mongoose findOne, update and exec 【发布时间】:2015-04-05 00:12:32 【问题描述】:

我很困惑如何根据following documentation 使用 mongoose 使用 findOne().update().exec() 应该返回一个承诺,但返回的内容没有失败成员:

var ret = mongoose.models[collection].findOne(_id:id)
      .update(status:status)
      .exec();
console.log('having fail:',ret.fail);//undefined
console.log('having catch:',ret.catch);//undefined
console.log('having then:',ret.then);//this is defined

这可能是因为他们的承诺没有实现失败或捕获,我必须尝试在最后一个 .then 上设置一个拒绝函数,看看是否会被调用:

promise.then(returningPromise)
  .then(returningPromise)
  .then(returningPromise)
  .then(null,handleFail)

然后我尝试以下方法:

var ret = mongoose.models[collection].findOne(_id:id)
//      .update(status:status)
        .exec(function(er,dt)
          //callback: null  _id: 000000000000000000000001,...
          console.log('callback:',er,dt);
      );

很高兴看到我得到了一些东西,但取消注释更新,我得到以下内容:

var ret = mongoose.models[collection].findOne(_id:id)
        .update(status:status)
        .exec(function(er,dt)
          //callback: null null
          console.log('callback:',er,dt);
      );

记录也没有更新。我知道如果没有找到记录但没有更新它确实找到了记录。

所以我的主要问题是如何使用 findOne 和 update(而不是 findOneAndUpdate)更新此记录,第二个问题是如果第一个 promise 拒绝,是否会调用最后一个 .then 的拒绝。如果不是,那么由于 mongoose 承诺不支持失败或捕获,那么最后如何捕获。

【问题讨论】:

【参考方案1】:

刚刚注意到我必须提供一个更新标准,以下似乎对我有用:

  return Q().then(function()
    var d = Q.defer();
    mongoose.models[col].findOne(_id:id)
          .update(_id:id,status:status)
          .exec(function(e,dt)
              if(e)
                d.reject(e);return;
              
              d.resolve(dt);
            );
    return d.promise;    
  );

添加了 Q 依赖,这样我就可以返回一个不需要我更改调用代码的承诺。

【讨论】:

以上是关于猫鼬 findOne,更新和执行的主要内容,如果未能解决你的问题,请参考以下文章

节点,猫鼬“findOne”在另一个集合的“find”内的一个集合上

猫鼬 findOne 方法返回 null

您可以在猫鼬中执行多个嵌套填充吗?

猫鼬 findOne :异步和同步之间的不同

如何使用猫鼬 findOne

猫鼬承诺文档说查询不是承诺?