Mongoose - 无法将子文档推送到父文档中的数组中

时间:2018-02-12 10:55:17

标签: node.js mongodb mongoose mongoose-schema

我正在尝试将子文档(ApplicationSchema)推送到我的Job模式中。但它似乎没有用。

以下是我的工作架构:

import mongoose from 'mongoose';
    const Schema = mongoose.Schema;

    var ApplicationSchema = require('./Application');

    const Job = new Schema({
      skills : {
        type : Array
      },
      active : {
        type : Boolean,
        default : false
      },
      applications: [ApplicationSchema],
      userId : {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
      }
    },{timestamps : true});

    export default mongoose.model("Job", Job)

这是子文档(ApplicationSchema)。我在这个架构中还有5个子文档。 我正在用一对键值对的talentId及其值推送一个对象。但它不起作用。 我在数组中得到一个新对象,但是我想要推送的对象没有被推送。

import mongoose from 'mongoose';
const Schema = mongoose.Schema;

var notesSchema = require('./notesSchema');
var documentSchema = require('./documentSchema');
var assessmentSchema = require('./assessmentSchema');
var interviewScheduleSchema = require('./interviewScheduleSchema');
var referenceSchema = require('./referenceSchema')

const ApplicationSchema = new Schema({
  talentId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Talent'
  },
  applicationType: {
    type: Number
  }
  notes: [notesSchema],
  documents: [documentSchema],
  assessment: [assessmentSchema],
  interviewSchedule: [interviewScheduleSchema],
  references: [referenceSchema]
},{
  timestamps: true
});

export default ApplicationSchema;

以下是我在API端点中的代码

.post((req, res, next) => {
  Job.findById(req.params.jobId)
  .then((job) => {
    if (job != null) {
      job.applications.push(req.body);
      job.save()
      .then((job) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'application/json');
        res.json(job);
      })
    }
    else {
      err = new Error('Job ' + req.params.jobId + 'not found')
      err.status = 404;
      return next(err);
    }
  }, (err) => next(err))
  .catch((err) => next(err));
})

req.body包含以下对象

{ talentId: '5a813e1eb936ab308c4cae51' }

3 个答案:

答案 0 :(得分:0)

如果您已拥有作业文档的ID,则可以通过执行以下操作直接推送应用程序对象:

Job.update(
    { _id: req.params.jobId }, 
    { $push: { applications: req.body} },
    callback
);

或者您可以使用promise来处理此问题。如果您只保存应用程序的ID,那么您可能希望更改您的作业架构以存储应用程序的ID而不是整个应用程序架构。

请仔细阅读documentation,因为这是非常基本的更新查询。

答案 1 :(得分:0)

你有,

talentId: {type: mongoose.Schema.Types.ObjectId,
           ref: 'Talent'}

但您的req.body包含:

{ talentId: '5a813e1eb936ab308c4cae51' }

应该是:

{ talentId: mongoose.Types.ObjectId('5a813e1eb936ab308c4cae51') }

答案 2 :(得分:0)

事实证明代码没有任何问题。

我使用的是导入和导出默认语法,但这似乎不适合。

import mongoose from 'mongoose';
const Schema = mongoose.Schema;

export default ApplicationSchema;

我用Common JS语法替换它们,一切正常。

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

module.exports = ApplicationSchema;

我为Job文档文件和每个子文档文件以及代码都工作了。