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

我正在尝试更新存储在特定用户的待办事项数组中的待办事项数组中的单个“待办事项”项目。一个典型的用户可能看起来像这样:


{ 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”数组中的待办事项。我在这里有点迷茫,不知道该去哪里。任何帮助将不胜感激。


婷婷同学_
浏览 130回答 2
2回答

慕容708150

您可以为此使用 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();}});

慕莱坞森

在 的情况下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);})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript