使用Mongoose返回更新的集合

Gui*_*meA 28 javascript mongoose mongodb node.js express

我使用nodejs/express/mongoose/angularjs.我想更新一个名为Lists的集合,它有几个属性,其中一个是项目数组.在下面的代码中,我在items数组中推送一个新的任务项.一切正常,但更新功能不会发回更新的集合,然后我必须对数据库执行另一个查询.有没有更有效的方法来做到这一点?

nodejs/express代码:

exports.addTaskToList = function(req, res) {
    var listId = req.params.Id;
    var taskId = req.params.TaskId;
    Lists.update({_id: listId}, {$push: {items: taskId}}, {safe:true, upsert: true}, function(err, result){
        if(err) {
            console.log('Error updating todo list. ' + err);
        }
        else{
            console.log(result + ' todo list entry updated - New task added');
            Lists.findById(listId).populate('items').exec(function (err, updatedEntry) {
                if (err) {
                    console.log('Unable to retrieve todo list entry.');
                }
                res.send(JSON.stringify(updatedEntry));
            });
        }           
    });
};
Run Code Online (Sandbox Code Playgroud)

此外,数组项是ObjectIds的数组.这些项目位于单独的模式中,因此位于单独的集合中.是否可以推送整个对象,而不仅仅是其_id,以便不会创建另一个集合?

Mat*_*yhr 26

更新方法 不返回更新的文档:

但是,如果我们不需要在我们的应用程序中返回的文档而只是想直接更新数据库中的属性,那么Model#update适合我们.

如果您需要更新并退回文档,请考虑以下选项之一:

传统方法:

Lists.findById(listId, function(err, list) {
    if (err) {
        ...
    } else {
        list.items.push(taskId)
        list.save(function(err, list) {
            ...
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

更短的方法:

Lists.findByIdAndUpdate(listId, {$push: {items: taskId}}, function(err, list) {
    ...
});
Run Code Online (Sandbox Code Playgroud)

  • 此外,它不会返回"新"更新元素,而是返回"旧"元素.如果您想要实际更新的元素,则必须添加选项{new:true} (20认同)
  • 是的,但重要的是要注意`findByIdAndUpdate`不运行`pre`,`post`和stuff Schema Methods,所以`mySchema.pre('save')`不会使用它. (4认同)

KAR*_*N.A 25

使用findOneAndUpdate()方法并在查询参数中使用选项{{new":true}

return this.sessionModel
       .findOneAndUpdate({user_id: data.user_id}, {$set:{session_id: suuid}}, { "new": true})
       .exec()
       .then(data=>{
        return {
          sid: data.session_id
            }
        })
Run Code Online (Sandbox Code Playgroud)