Mongodb归还旧集合

时间:2017-07-17 13:38:56

标签: javascript node.js mongodb express mongoose

router.post('/orders/finish', function(req, res, next) {
var order_id = req.body.order_id;
var user_id  = req.body.user_id;
var table_id = '';

var result = [];



mongo.connect(url, function(err, db) {
    assert.equal(null, err);

    db.collection('tables').update({id: table_id, status: true}, {$set: {status: false}}, function(err, result) {
        assert.equal(null, err);

    });
    var cursorTables = db.collection('tables').find({status: false});
    cursorTables.forEach(function(doc, err) {
        assert.equal(null, err);
        result.push(doc);
    }, function() {
        db.close();
        res.send(JSON.stringify(result));
    });

});

我正在更新表集合并尝试获取它们,但是我没有更新就得到了旧集合。但是在下一个请求中它已经改变了。

3 个答案:

答案 0 :(得分:2)

当你进行.find()调用时,你的收藏品还没有更新。

您可以选择在.update()调用的回调中调用.find(),也可以根据您的版本使用promises或async / await。

另一种解决方案是将findAndModify选项一起使用:

  

可选。如果为true,则返回修改后的文档而不是原始文档。 findAndModify()方法忽略删除操作的新选项。默认值为false。

答案 1 :(得分:0)

在致电update

之前,您应该等待find完成
db.collection('tables').update({id: table_id, status: true}, {$set: {status: false}}, function(err, result) {
        assert.equal(null, err);
        var cursorTables = db.collection('tables').find({status: false});
        cursorTables.forEach(function(doc, err) {
            assert.equal(null, err);
            resultTables.push(doc);
        }, function() {
            db.close();
        });
    });

答案 2 :(得分:0)

我建议您使用Async

router.post('/', function(req, res) {
    var order_id = req.body.order_id;
    var user_id  = req.body.user_id;
    var table_id = '';

    mongo.connect(url, table_id, function(err, db) {
        myFuntion(db, table_id, function(result) {
            res.send(JSON.stringify(result)); // it should be what you need
        })
    })

});

function myFuntion(db, table_id, callback) {
    var result = [];
    async.waterfall([
        function(callback) {

            db.collection('tables').update({id: table_id, status: true}, {$set: {status: false}}, function(err, result) {
                assert.equal(null, err);
                callback(null);
            });

        }, function(callback) {
            db.collection('tables').find({status: false}, function(err, docs) {
                docs.forEach(function(doc) {
                    result.push(doc);
                })
                callback(null, result);
            });
        }
    ], function(err, result) {
        callback(result);
    })

}