首页 > 解决方案 > Model.find({_id:req.body.id}) 找到对象但是 Model.updateOne({_id:req.body.id},{//update}) 没有找到对象

问题描述

app.post("/admin/editAssignedTask/:id", (req, res) => {
  Task.findById(req.params.id, (err, task) => {
    task.title = req.body.title;
    task.priority = req.body.priority;
    task.date = new Date(req.body.date);
    task.description = req.body.description;
    if (req.body.assignTo) {
      console.log(req.body.assignTo);
      if (typeof req.body.assignTo == "string") {
        task.assignedTo = [...task.assignedTo, req.body.assignTo];
        Staff.find({ _id: req.body.assignTo }, (err, staff) => {
          console.log(staff);
        });
        Staff.updateOne(
          { _id: req.body.assignTo },
          { $set: { $push: { todo: req.params.id } } },
          (err, up) => {
            console.log(up);
          }
        );

在上面的代码中,staff.find() 返回

 [ { todo: [ 5cc44b02abde080691893e41, 5cc46186db0195071f117808 ],
 completed: [],
 _id: 5cc34724ab9d2d231642f925,
 name: 'gokul',
 mailId: 'gokul',
 __v: 12 } ]

但是 staff.updateOne() 返回 { ok: 0, n: 0, nModified: 0 } 这里 n 是 0 这意味着没有匹配的对象。!为什么会这样?

下面是员工模式

var userSchema = new mongoose.Schema({
  name: String,
  mailId: String,
  todo: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Task"
    }
  ],
  completed: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "Task"
    }
  ]
});

在此处输入图像描述

标签: node.jsmongodbmongoose

解决方案


改变

Staff.updateOne(
  { _id: req.body.assignTo },
  { $set: { $push: { todo: req.params.id } } },
  (err, up) => {
    console.log(up);
  }
);

Staff.updateMany(
  { _id: { $in: req.body.assignTo } },
  { $push: { todo: mongoose.Types.ObjectId(req.params.id) } },
  (err, up) => {
    console.log(up);
  }
);

1) 不要使用 $set 来推送或拉取数组元素。

2) 因为在模式中,属性 'todo' 是一个 objectIDs 数组而不是字符串,我们需要使用 mongoose.Types.ObjectId() 将字符串显式转换为 objectIDs


推荐阅读