为什么“ $ pull”不能与findbyidandupdate请求一起使用?

时间:2019-12-18 14:22:29

标签: node.js mongodb express mongoose

This is the user document , todos is an array of id of todo document

this is the todos document 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);
  });
})

3 个答案:

答案 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)

我认为我找到了问题:

  • 首先,我手动将ID添加到mongodb中的数组中,所以我认为这是一个问题
  • 我的添加设置请求无法正常工作:User.findByIdAndUpdate(req.params.id,{ $ set {$ addToSet:{todos:req.params.idTodo}}}}- > $ set在这里是错误的,只是我在没有$ set的情况下实现了此请求并且它起作用了。
  

因此在那之后,我可以手动将猫鼬请求添加到todo数组中,而不是手动添加ID。   *正如我所说的,我也有个警告:*    不建议使用的警告:猫鼬:不将useFindAndModify选项设置为false的findOneAndUpdate()和findOneAndDelete()

为此我添加了: mongoose.connect('mongodb:// localhost:27017 / Db_Todo',{ useUnifiedTopology:true,useNewUrlParser:true,useFindAndModify:false} );