用户保存后未在mongo中更新?

时间:2019-06-08 23:41:15

标签: javascript node.js mongodb mongoose

我有一个待办事项应用程序。我正在尝试更新存储在当前登录用户中的待办事项数组中的特定待办事项。这是执行此操作的代码:

User.findById(req.user._id)
        .then(user => {
            user.todos.forEach(function(todo) {
                if (todo._id == req.params.todoId) {
                    todo.completed = !todo.completed;
                    console.log(todo.completed);
                }
            })
            return user.save();
        })
        .then(result => {
            console.log(result);
            res.json(result);
        })
        .catch(function(err) {
            res.send(err);
        })

当我console.log结果时,一切正常。当我在我的javascript文件中进行的ajax调用中控制台记录更新的Todo时,一切似乎都很好。待办事项已更新。但是,当我停止服务器并在Mongo中找到用户时,待办事项仍未更新。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

当您修改文档上的嵌套属性时,猫鼬可能不会意识到有任何更改,因此它不会知道将更改持久保存在数据库中(否则它将必须通过所有操作,如果您这样做,则可能会变得很昂贵有一个大文件,但只有很小一部分改变了)。

这可以通过markModified方法完成:

 user.todos.forEach(function(todo) {
   if (todo._id == req.params.todoId) {
     todo.completed = !todo.completed;
     console.log(todo.completed);
   }
 })
 user.markModified('todos');
 return user.save();

答案 1 :(得分:0)

建议您不要在JavaScript代码中进行操作,而只能在查询中进行操作,这样更有效。

db.getCollection('User').update({"_id":<req.user._id>,"todo._id":<req.params.todoId>},
 {$set: 
     {'todo.$.completed': true}
 }, {
   new : true
 }
)

在此查询中,您还需要传递完成状态。