Node.js “为什么?”$拉;是否';是否不处理FindByAndUpdate请求?

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.

NB:我有一个警告:不推荐使用警告:Mongoose:
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的情况下实现了这个请求,并且它工作了
所以在那之后,我可以通过mongoose请求而不是手动地将Id添加到todo数组中。 *正如我所说,我也有一个警告:* 不推荐使用警告:不推荐使用UseFindModify选项设置为false的Mongoose:FindOneAndDupDate()和findOneAndDelete()

为此,我补充说:
猫鼬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您可以通过编辑问题来显示示例文档吗?如果您演示如何保存文档,也可能会有所帮助。现在检查一下,我添加了一条发生在我身上的警告