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

时间:2019-06-08 20:56:18

标签: javascript node.js mongodb mongoose

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

{ 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模型创建待办事项,并将其推送到用户的待办事项数组中。最初,我尝试使用以下方法简单地查找和更新单个待办事项:

db.Todo.findOneAndUpdate({_id: req.params.todoId}, req.body, {new: true})
   .then(function(updatedTodo) {
       res.json(updatedTodo);
   })
   .catch(function(err) {
       res.send(err);
   })

...,这似乎在Todos集合中更新了待办事项,但是并没有更新嵌套在用户“ todos”数组中的待办事项。因此,我想我应该首先找到用户并像这样更新特定待办事项的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 个答案:

答案 0 :(得分:0)

对于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);
})

答案 1 :(得分:0)

您可以为此使用异步/等待。

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();
}
});