mongoose删除不会删除所有文档

时间:2015-09-21 01:43:04

标签: javascript node.js mongodb mongoose mongodb-query

我有2个集合(User和Offer),我使用async来执行一系列操作,但不删除最后一个文档。

async.series([
  function (callback) {
    User.findOne({_id: req.user._id}, function (err, result) {
      if (err) {
        return callback(err);
      }
        user = result;
        callback();
      });
    },
    function (callback) {
      Offer.find({_owner: user._id}, function (err, offers) {
        if (err) {
          return callback(err);
        }
        var i = offers.length;
        while (i--) {
          var offer = offers[i];
          Offer.remove(offer, function (err) {
            return callback(err);
          });
        }
        callback();
      });
    },
    function (callback) {
      User.remove(user, function (err) {
        if (err) {
          return callback(err);
        }
      });
      callback();
    }
    ], function (err) {
      if (err) {
        return res.status(503).json({message: err});
      }
      res.status(200).json({message: 'User and offers successfully deleted'});
    });

我打开了mongoose调试,我看到该用户的8个文档被删除(正如预期的那样)。示例消息:

Mongoose: users.remove({ active: true, role: 'user', favoredOffers: [], 
salt: 'qIADYcMS3SiAuF3M007E9g==', hashedPassword: '**', emailVerified: true, 
name: 'Test', email: 'test1@test.com', emailVerificationToken: '***', 
updatedAt: new Date("Mon, 21 Sep 2015 00:52:58 GMT"), 
createdAt: new Date("Mon, 21 Sep 2015 00:52:58 GMT"), 
_id: ObjectId("55ff54ea1d6201ff42ea0045") }) { 
safe: { w: 'majority', wtimeout: 10000 } }

当我运行测试时,结果是,这个文档仍然存在。起初我认为我的测试运行得太快(async.waterfall)但后来我切换到async.series并且行为仍然存在,当我查看test-db时,文档仍然存在。

测试代码:

it.only('should allow deleting my account and all my offers if my password was right', function (done) {
    async.series([function (callback) {
        login(server, server.delete('*url*'), 'test@test.com', 'testpwd1', function (server) {
            server
                .send({password: 'testpwd1'})
                .expect(200)
                .end(callback);
        });
    }, function (callback) {
        User.findOne({email: 'test1@test.com'}, function (err, user) {
            callback(user ? new Error('user was still found in mongo') : null); //misuse not found user as 'error'-object
        });
    }, function (callback) {
        Offer.find({_owner: user1._id}, function (err, offers) {
            expect(offers).to.have.length(0);
            callback();
        });
    }], done);
});

结果:未捕获的AssertionError:期望[Array(1)]长度为0但得到1

我错过了什么或者我不理解mongdb的行为。

1 个答案:

答案 0 :(得分:2)

虽然按<div class="btn-group menuSection"> <div class="menuGrid" ng-repeat="main in mains"> <input type="radio" name="dishes" class="btn btn-default btn-sm btn-block" ng-value="main" ng-model="$parent.selectedMain" ng-change="setDish();"/> {{main}} </div> <div class="menuGrid"> <input type="text" class="form-control input-sm" ng-model="mainOtherText" ng-show="selectedMain == 'Other'" ng-change="setDish();" placeholder="enter other here"/> </div> test : {{mainDish}} </div> 分割的那些操作被串联调用,但问题是async.series循环不是异步控制的,因此移动到下一阶段的回调是在所有删除完成之前被调用。

您可以使用async.whilst来控制来自.remove()操作的回调,但这样做太过分了,因为您真的应该发出&#34;查询&#34;直接转到while,而不是尝试使用.remove()返回的列表:

.find()

当然,如果删除操作的结果没有删除任何内容,那么您就知道输入与用户不匹配。

异步库允许回调传递,因此您不需要控制每个阶段。任何错误都会立即转到结束块,以及每个阶段的结果。另外,对于这种情况,请查看parallel,因为一个阶段不依赖于另一个阶段首先完成。