NB:我收到此警告:DeprecationWarning:猫鼬:findOneAndUpdate()
和findOneAndDelete()
(未将useFindAndModify
选项设置为false)。
我不知道这个警告是什么意思
router.put('/deleteTodoFromUser/:id/:idTodo', passport.authenticate('bearer'), (req, res) => {
User.findByIdAndUpdate(req.params.id, { $pull: { todos: req.params.idTodo } }, (err, usr) => {
if (err) {
res.send(err);
}
res.send(usr);
});
})
答案 0 :(得分:2)
我认为语法必须是这样的:
User.findByIdAndUpdate(
req.params.id,
{ $pull: { todos: { $in: [req.params.idTodo] } } },
{ new: true },
(err, usr) => {
if (err) {
res.send(err);
}
res.send(usr);
}
);
请查看官方文档上的this链接。
答案 1 :(得分:2)
JBones的答案必须符合预期。
但是为了解决您的问题,在这里我将逐步说明。
用户架构:
X
Todo模式:
Y
路线:
const mongoose = require("mongoose");
const userSchema = new mongoose.Schema({
name: String,
todos: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Todo"
}
]
});
module.exports = mongoose.model("User", userSchema);
测试:
假设您的todos集合中有这3个todo文档。
const mongoose = require("mongoose");
const todoSchema = new mongoose.Schema({
name: String,
completed: Boolean
});
module.exports = mongoose.model("Todo", todoSchema);
还有这样的用户文档:
router.put("/deleteTodoFromUser/:id/:idTodo", (req, res) => {
User.findByIdAndUpdate(
req.params.id,
{ $pull: { todos: { $in: [req.params.idTodo] } } },
{ new: true },
(err, usr) => {
if (err) {
res.status(500).send(err);
}
if (usr) {
res.send(usr);
} else {
res.status(400).send("Bad request - User not found");
}
}
);
});
当我们尝试删除用户ID为5dfa846379db991c3c4341e4的待办事项ID 5dfa676fe1783d0c10a8d826时,
网址必须是这样的[
{
"_id" : ObjectId("5dfa6776e1783d0c10a8d827"),
"name" : "Todo 3",
"completed" : true,
"__v" : NumberInt(0)
},
{
"_id" : ObjectId("5dfa676fe1783d0c10a8d826"),
"name" : "Todo 2",
"completed" : false,
"__v" : NumberInt(0)
},
{
"_id" : ObjectId("5dfa6768e1783d0c10a8d825"),
"name" : "Todo 1",
"completed" : false,
"__v" : NumberInt(0)
}
]
结果将如下所示:(已删除5dfa676fe1783d0c10a8d826)
{
"_id" : ObjectId("5dfa846379db991c3c4341e4"),
"todos" : [
ObjectId("5dfa6768e1783d0c10a8d825"),
ObjectId("5dfa676fe1783d0c10a8d826"),
ObjectId("5dfa6776e1783d0c10a8d827")
],
"name" : "User 1",
"__v" : NumberInt(0)
}
实际上,如果您检查用户集合,您的用户文档中将看到2个待办事项。
答案 2 :(得分:0)
我认为我找到了问题:
因此在那之后,我可以手动将猫鼬请求添加到todo数组中,而不是手动添加ID。 *正如我所说的,我也有个警告:* 不建议使用的警告:猫鼬:不将useFindAndModify选项设置为false的findOneAndUpdate()和findOneAndDelete()
为此我添加了: mongoose.connect('mongodb:// localhost:27017 / Db_Todo',{ useUnifiedTopology:true,useNewUrlParser:true,useFindAndModify:false} );