为了账号安全,请及时绑定邮箱和手机立即绑定

用猫鼬更新数组中的项目?

用猫鼬更新数组中的项目?

婷婷同学_ 2021-06-21 21:01:50
我正在尝试更新存储在特定用户的待办事项数组中的待办事项数组中的单个“待办事项”项目。一个典型的用户可能看起来像这样:{ isAdmin: false,  _id: 5cefe9b72efc1c19a0318233,  username: 'a',  email: 'aaaaa@gmail.com',  todos:    [ { day: 'Monday',        completed: false,        _id: 5cf10e7fba969c4be4d356db,        name: 'asdf',        createdDate: 2019-05-31T11:22:39.423Z,        __v: 0 },      { day: 'Monday',        completed: false,        _id: 5cf10e8bba969c4be4d356dc,        name: 'pp',        createdDate: 2019-05-31T11:22:51.248Z,        __v: 0 }],  __v: 12 }当用户创建一个 todo 时,这个 todo 是用另一个 Todo 模型创建的,并被推送到用户的 todos 数组中。起初,我尝试简单地查找和更新单个待办事项:db.Todo.findOneAndUpdate({_id: req.params.todoId}, req.body, {new: true})   .then(function(updatedTodo) {       res.json(updatedTodo);   })   .catch(function(err) {       res.send(err);   })...它似乎更新了 Todos 集合中的 todo,但它不会更新嵌套在用户“todos”数组中的 todo。所以,我想我会首先找到用户并更新特定待办事项的 id,如下所示:User.findById(req.user._id, function(err, user) {    if (err) {        console.log(err);    } else {        user.todos.forEach(function(todo) {            if (todo._id == req.params.todoId) {                todo.completed = !todo.completed;            }    }});...但同样,它似乎并没有真正更新嵌套在用户的“todos”数组中的待办事项。我在这里有点迷茫,不知道该去哪里。任何帮助将不胜感激。
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

您可以为此使用 async/await。


user = await User.findById(req.user._id);

user.todos[user.todos.findIndex(i=>i._id==="todos id")].complated = true;

user.save();

或者


User.findById(req.user._id, function(err, user) {

   if (err) {

      console.log(err);

   } else {

      user.todos.forEach(function(todo,index) {

         if (todo._id === req.params.todoId) {

            user.todos[index].completed = true;

         }

      User.updateOne({_id:req.user._id},user).exec();

}

});


查看完整回答
反对 回复 2021-06-24
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

在 的情况下User.findById(),不足以改变todo.completed值。你也必须保存它。例如:


User.findById(req.user._id)

.then(user => {

    user.todos.forEach(function(todo) {

        if (todo._id === req.params.todoId) {

            todo.completed = !todo.completed;

        }

    })

    return user.save();

})

.then(result => {

   res.json(result);

})

.catch(function(err) {

    res.send(err);

})


查看完整回答
反对 回复 2021-06-24
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信