node.js - Mongoose 引用被覆盖

标签 node.js mongodb express mongoose

我有点陷入困境。每当我以登录用户身份创建新简历时,它不会将简历 ID 添加为数组。即,[“20293”,“2932392”,“32903239”]

相反,它会覆盖用户架构中的当前简历 ID。这是代码

用户架构

const UserSchema = new Schema({
    _vId: {
        type: String,
        default: id.generate()
    },
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    accountType: {
        type: String,
        enum: ['Alphaneer', 'Administrator', 'Support', 'PRO'],
        default: 'Alphaneer'
    },
    email: {
        type: String,
        required: true,
        trim: true
    },
    username: {
        type: String,
        required: true,
        trim: true,
        unique: true
    },
    bio: {
        type: String,
        default: "No bio provided."
    },
    // TODO: Hash the password before inserting as a document :)
    password: {
        type: String,
        required: true
    },
    createdAt: {
        type: String,
        default: moment(new Date()).format("MMM DD, YYYY") // "Sun, 3PM 17"
    },
    resume: [ { type: mongoose.Schema.ObjectId, ref: "Resume" } ]
});
<小时/>

我在哪里发布简历

 // POST /dashboard/resume/create
router.post('/resume/create', (req, res, next) => {
  Resume.create(req.body, (err, resume) => {
    if (err) {
      var err = new Error("Error:" + err);
      err.status = 404;
      next(err);
    } else {
      req.user = jwtDecode.decode(req.session.tokenID, 'secret');
      //I am assuming that you have saved your resume and getting the saved object in `resume`, now update the logged in user in req.user
      var user = req.user.sessionId;
      var updateData = {
        resume: resume._id
      }
      //save the updated user
      User.findByIdAndUpdate(user, updateData, function(err, user) {
        console.log(user);
        if (err) {
          res.json(err);
        } else {
          res.json(user);
        }
      })
    }
  })
});

gif of submitting new resumes

更新:

error picture

更新的代码:

// POST /dashboard/resume/create
router.post('/resume/create', (req, res, next) => {
  Resume.create(req.body, (err, resume) => {
    if (err) {
      var err = new Error("Error:" + err);
      err.status = 404;
      next(err);
    } else {
      req.user = jwtDecode.decode(req.session.tokenID, 'secret');
      //I am assuming that you have saved your resume and getting the saved object in `resume`, now update the logged in user in req.user
      var user = req.user.sessionId;
      var updateData = {
        resume: resume._id
      }
      //save the updated user
      User.findById(user, function(err, user) {
        console.log(user);
        if (err) {
          res.json(err);
        } else {
          user.resume.push(resume.id)
          user.save(function(user) {
            return res.json(user);
          });
        }
      })
    }
  })
});

最佳答案

这是错误的:

var user = req.user.sessionId;
  var updateData = {
    resume: resume._id
  }
  //save the updated user
  User.findByIdAndUpdate(user, updateData, function(err, user) {
    console.log(user);
    if (err) {
      res.json(err);
    } else {
      res.json(user);
    }
  });

resume 字段是一个数组,您将其作为字符串字段进行操作。 findOneAndUpdate 方法做了两件事:

  1. 通过 ID 查找文档
  2. 使用新数据更新

第二个参数是要设置的新数据。所以,第二步翻译为:

User.upate({ _id: user }, { resume: resume._id });

你能看出哪里出了问题吗? resume 必须存储简历 ID 的数组,并且您正在将 ID 设置为值。显然这会抛出 MongooseError。

您的第二个镜头是正确的,但有一个拼写错误:

User.findById(user, function(err, user) {
    console.log(user);
    if (err) {
      res.json(err);
    } else {
      user.resume.push(resume.id)
      user.save(function(user) {
        return res.json(user);
      });
    }
  });

您必须添加 _id 字段,因为这是新创建的文档(简历)的 ObjectID。因此,您需要改为 user.resume.push(resume._id)

更新

根据您最后的评论,您想要填充您的用户模型,即通过关联 ID 检索所有模型数据。在这种情况下,建议简历数组更改如下:

...
resumes: [
  {
     resume: {
       type: Schema.Types.ObjectId,
       ref: 'Resume'
     }
   }
 ]

要使用所有简历数据填充用户文档,您只需引用 resumes 字段数组中的 resume 键。

User.findById(user, function(err, user) {
    if (err) {
      return res.json({ success: false, message: err.message });
    }
    user.resume.push(resume.id)
    user.save(function(err, user) {
      if (err) {
        return res.json({ success: false, message: err.message });
      }
      // save was fine, finally return the user document populated
      User.findById(user).populate('resumes.resume').exec(function(err, u) {
        return res.json(u);
      });
    });
  }
});

populate 方法接受一个字符串,其中包含我们想要用其模型数据填充的字段。在您的情况下,这是一个唯一的字段(resume)。运行查询后,您将得到如下内容:

{
  _id: a939v0240mf0205jf48ut84sdfdjg4,
  ...,
  resumes: [
    resume: {
      _id: f940tndfq4ut84jofgh03ut85dg9454g,
      title: 'Some title'
    },
    ...
  ]
}

关于node.js - Mongoose 引用被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41313603/

相关文章:

javascript - 删除 mongodb 中具有空数组值的键

mongodb - 创建现有 mongodb 数据库的子集

javascript - 使用 Node.js + Express,无需模板引擎

javascript - 在组织 AngularJS 应用程序时,您的模块是否都应该具有相同的名称?

javascript - res.render() 之后的 Node JS : Error with res. download()

mongodb - Mongoose 验证子文档数组

javascript - 根据请求设置对象。在调用第二个中间件时,两个中间件中的第一个似乎不存在

javascript - req.user 未定义,但登录工作正常

javascript - 在 Node 中运行时制作 mocha "use strict"

node.js - AWS EB 部署 Node 应用程序 : failed to run npm install