nodejs mongoDB findOneAndUpdate();即使在更新数据库后返回true

时间:2017-09-05 15:30:49

标签: javascript angularjs node.js mongodb ionic-framework

我正在研究Ionic-1 + nodejs + angular应用程序。我的mongoDb findOneAndUpdate()函数在每次调用时返回true,即使第一次调用更新数据库也是如此。 的NodeJS:

app.post('/booking', function (req, res) {

var collection = req.db.get('restaurant');
var id = req.body.id;
var status = req.body.status;
collection.findOneAndUpdate({status: status, id: id},{$set:{status:"booked"}}, function (e, doc) {
    console.log(id, status);
    if (e) {
        console.log(e);
    }
     else if(!doc) {
        res.send(false);
    }
     else {
        res.send(true);
    }
});
});

controller.js

$scope.bookMe = function(id){
    var Obj = {status: "yes", id: id};
    myService.booking(Obj).success(function(res){
        console.log(Obj, "Checking  status")
        console.log(res);
        if (res == true) {
            var alertPopup = $ionicPopup.alert({
            title: 'Booking Confirm',
            template: 'Thanks For Booking'
            });
    }
    else{
        var alertPopup = $ionicPopup.alert({
            title: 'Error',
            template: ' Not available'
            });
    }
    })

};

我做错了。我的数据库得到更新但它总是在下次调用时返回true。

2 个答案:

答案 0 :(得分:0)

关于findOneAndUpdate的文档说:

  

查找匹配的文档,根据更新arg更新它,传递任何选项,并将找到的文档(如果有)返回给回调。如果传回回调,则立即执行查询。

因此,您有doc的常规行为。

答案 1 :(得分:0)

注意:

  1. 由于您正在检查可用性status="yes",更好的硬编码,而不是从请求查询/数据中获取它。
  2. 根据您的要求res.send(true)/ res.send(false)更改回复。
  3. 以下代码可以使用

    app.post('/booking', function (req, res) {
    
      var collection = req.db.get('restaurant');
    
      collection.findOneAndUpdate({
            status: "yes",
           _id: req.body.id
         }, {
            $set: {
            status: "booked"
         }
      }, function (err, result) {
    
            //Error handling
            if (err) {
               return res.status(500).send('Something broke!');
            }
    
           //Send response based on the required
            if (result.hasOwnProperty("value") && 
              result.value !== null) {
                 res.send(true);
            } else {
                 res.send(false);
            }
       });
    });