Node.js “为什么?”$拉;是否';是否不处理FindByAndUpdate请求?
NB:我有一个警告:不推荐使用警告:Mongoose:Node.js “为什么?”$拉;是否';是否不处理FindByAndUpdate请求?,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,NB:我有一个警告:不推荐使用警告:Mongoose:findoneandeddate()和findOneAndDelete()没有设置为false的useFindAndModify选项都不推荐使用。 我不知道这个警告是什么意思 router.put('/deleteTodoFromUser/:id/:idTodo', passport.authenticate('bearer'), (req, res) => { User.findByIdAndUpdate(req.params.
findoneandeddate()
和findOneAndDelete()
没有设置为false的useFindAndModify
选项都不推荐使用。
我不知道这个警告是什么意思
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);
});
})
我认为语法应该是这样的:
{
"_id" : ObjectId("5dfa846379db991c3c4341e4"),
"todos" : [
ObjectId("5dfa6768e1783d0c10a8d825"),
ObjectId("5dfa676fe1783d0c10a8d826"),
ObjectId("5dfa6776e1783d0c10a8d827")
],
"name" : "User 1",
"__v" : NumberInt(0)
}
User.findByIdAndUpdate(
请求参数id,
{$pull:{todos:{$in:[req.params.idTodo]}},
{新:正确},
(错误,usr)=>{
如果(错误){
res.send(err);
}
res.send(usr);
}
);
看看官方文件的链接 JBones的答案必须如预期的那样有效 但为了解决你的问题,我在这里一步一步地解释 用户架构:
const mongoose=require(“mongoose”);
const userSchema=new mongoose.Schema({
名称:String,
待办事项:[
{
类型:mongoose.Schema.Types.ObjectId,
参考:“待办事项”
}
]
});
module.exports=mongoose.model(“用户”,userSchema);
待办事项模式:
const mongoose=require(“mongoose”);
const todoSchema=新的mongoose.Schema({
名称:String,
已完成:布尔值
});
module.exports=mongoose.model(“Todo”,todoSchema);
路线:
router.put(“/deleteTodoFromUser/:id/:idTodo)”,(req,res)=>{
User.findByIdAndUpdate(
请求参数id,
{$pull:{todos:{$in:[req.params.idTodo]}},
{新:正确},
(错误,usr)=>{
如果(错误){
资源状态(500)。发送(错误);
}
国际单项体育联合会(usr){
res.send(usr);
}否则{
res.status(400).send(“错误请求-未找到用户”);
}
}
);
});
测试:
假设您的todo集合中有这3个todo文档
[
{
"_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)
}
]
以及如下所示的用户文档:
{
"_id" : ObjectId("5dfa846379db991c3c4341e4"),
"todos" : [
ObjectId("5dfa6768e1783d0c10a8d825"),
ObjectId("5dfa676fe1783d0c10a8d826"),
ObjectId("5dfa6776e1783d0c10a8d827")
],
"name" : "User 1",
"__v" : NumberInt(0)
}
当我们尝试删除用户id 5dfa846379db991c3c4341e4的todo id 5DFA676FE1783D0C108D826时,
url必须类似于以下内容http://...../deleteTodoFromUser/5dfa846379db991c3c4341e4/5dfa676fe1783d0c10a8d826
结果如下:(5DFA676FE1783D0C108D826被删除)
事实上,如果您查看用户集合,您将在用户文档中看到2个待办事项。我想我发现了问题:
- 首先,我在mongodb中手动向数组添加Id,所以我认为这是一个问题
- 我的添加到集合请求工作不正常:User.findByIdAndUpdate(req.params.id,{$set{$addToSet:{todos:req.params.idTodo}}}-->$set在这里是错误的,只是我在没有$set的情况下实现了这个请求,并且它工作了
猫鼬mongodb://localhost:27017/Db_Todo“,{useUnifiedTopology:true,useNewUrlParser:true,UseFindModify:false});您能发布一些示例数据吗?它只是文档中的字符串数组(todos)是否要删除用户中的引用todo id,还是要同时删除用户中的引用和todo集合中的todo?我只想删除用户中的引用然后@JBone answer必须按预期工作,它只返回旧文档,但实际上删除了引用的todo。您可以通过添加第三个选项来获得更新的文档像这样的选项
{new:true}
。这必须在像这样的拉取选项之后{$pull:{todos:{$eq:req.params.idTodo}},{new:true}<代码>这个代码<代码> FordByDand更新< /COD>存在于您使用的Mango版本中吗?看来它在最新版本中不是根据文档存在的,但在我的情况下,返回的对象是相同的没有更新的对象。您可能要考虑<代码> FIDONE和UPDATE < /COD>控制台。日志(<代码>值为${req.params.idTodo}
)…看看它是什么prints@JBone您的答案实际上是有效的,但是如果没有{new:true}
选项,它会返回旧文档,因此我猜这会混淆Hassen,所以我更新了您的答案。同样的,可能问题出在我的mongoose版本中。原因与此请求相同:User.findByIdAndUpdate(req.params.id,{$set:{$addToSet:{todos:req.params.idTodo}}}},(err,usr)=>{@HassenBouzlima使用这些模式和代码,它应该可以工作。您能为您的问题添加一些用户和todo文档吗?我认为问题在于如何保存数据。当我要添加todo的引用Id和删除todo时,问题只发生在更新时it@HassenBouzlima您可以通过编辑问题来显示示例文档吗?如果您演示如何保存文档,也可能会有所帮助。现在检查一下,我添加了一条发生在我身上的警告