在 NodeJs 中将对象从一个集合移动到另一个集合的最佳方法

Best way to move object from one collection to other in NodeJs

如何将对象从一个集合移动到另一个集合?最简单和最安全的方法是什么?我正在尝试这样做:

app.post('/doneList/:id',function(req, res){
    var id = mongojs.ObjectId(req.params.id);
    var oneTodo;
    db.todoList.findOne({_id: id},function(err,docs){
        db.doneList.insert(docs,function(err,doc){
            res.json(doc);
        });

    }); 
    db.todoList.remove({_id: id});
});

但是当我尝试时它崩溃了。

更新:不要介意这个答案。跟着 Blakes Seven 的回答,更好。

它崩溃了,因为您在回调中插入之前就删除了。

试一试:

app.post('/doneList/:id',function(req, res){
    var id = mongojs.ObjectId(req.params.id);
    var oneTodo;
    db.todoList.findOne({_id: id},function(err,docs){
        db.doneList.insert(docs,function(err,doc){
            res.json(doc);
            db.todoList.remove({_id: id});
        });
    }); 
});

您通常需要处理 "inside" 回调,但 .findAndModify() 在这里也可能更清晰:

app.post('/doneList/:id',function(req, res){
    var id = mongojs.ObjectId(req.params.id);
    var oneTodo;
    db.todoList.findAndModify(
        {
            "query": { "_id": id },
            "remove": true
        },
        function(err,doc) {
            if (doc) {
                db.doneList.insert(doc,function(err,doc){
                    // respond moved
                });
            } else {
               // respond was not found
        }
    );

这样,在检索内容的同时,文档 "removed" 来自集合。当然,您只 .insert() 当实际文档匹配时 "inside" 来自初始 .findAndModify() 操作的回调。

少了一次数据库调用,少了一层嵌套。