我正在尝试更新存储在特定用户的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”数组中的待办事项。我在这里迷路了,不知道去哪里。任何帮助将不胜感激。
答案 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();
}
});