简体   繁体   中英

Mongoose relation one-to-many not work

I have a problem with mongoose schema relationship one-to-many: I have two documents company and agent, when I try to save the company document it cant be saved. Note: the parent document is the company and the child is the agent:

Company Schema :

'use strict';

/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
Schema = mongoose.Schema;

/**
* Company Schema
*/
var CompanySchema = new Schema({
name: {
    type: String,
    default: '',
    //required: 'Please fill Company name',
    trim: true
},
created: {
    type: Date,
    default: Date.now
},
updated: {
    type: Date,
    default: Date.now
},
address: {
    type: String,
    default: '',
    //required: 'Please fill Company address',
    trim: true
},
locked: {
    type: Boolean,
    default: true,
},
deleted: {
    type: Boolean,
    default: false,
},
logo: {
    type: String,
    default: '',
},
email: {
    type: String,
    default: '',
    //required: 'Please fill Company email',
},
tel: {
    type: String,
    default: '',
    //required: 'Please fill Company tel',
},
fax: {
    type: String,
    default: '',
    //required: 'Please fill Company fax',
},
type: {
    type: String,
    //required: 'Please fill Company type',
    trim: true
},
description: {
    type: String,
    default: '',
    trim: true
},
user: {
       type: Schema.ObjectId,
       ref: 'User'
   },
   agents: [{
      type: Schema.ObjectId,
      ref: 'Agent'
   }]
});

mongoose.model('Company', CompanySchema);

Agent Schema

'use strict';

/**
* Module dependencies.
*/
 var mongoose = require('mongoose'),
Schema = mongoose.Schema;

/**
* Agent Schema
*/
var AgentSchema = new Schema({
// Agent model fields   
// ...
firstname: {
    type: String,
    default: ''
},
lastname: {
    type: String,
    default: ''
},
email: {
    type: String,
    default: ''
},
password: {
    type: String,
    default: ''
},
roles: {
    type: Array,
},
created: {
    type: Date,
    default: Date.now
},
updated: {
    type: Date,
    default: Date.now
},
deleted: {
    type: Boolean,
    default: false
},
locked: {
    type: Boolean,
    default: false
},
company: {
    type: Schema.ObjectId,
    ref: 'Company'
  }
});

var exports = module.exports = mongoose.model('Agent', AgentSchema);

API

company.save(function(err){
  if(err){
    console.log('company err');
    return res.status(400).send({
      messages: errorHandler.getErrorMessage(err)
    });
  }else{
    console.log('company save');
    var agents = preapareAgents(req, company);
    Agent.create(agents, function(err){
      if(err){
        return res.status(400).send({
          messages: errorHandler.getErrorMessage(err)
        });
      }else{
        res.jsonp({
          company: company,
          agents: agents
        });
      }
    });
  }
});

prepareAgent

var preapareAgents = function(req,company){
var admin = new Agent(req.body.admin);
admin.roles = ['admin', 'read','write'];
admin.company = company;
admin.locked = false;

var agents = req.body.agents;

for (var i = 0; i <= agents.length - 1; i++) {
    agents[i].roles = [agents[i].role];
    agents[i] = new Agent(agents[i]);
    agents[i].company = company;
}

agents.push(admin);

return agents;
};

****Error:
CastError: Cast to ObjectId failed for value "[object Object]" at path "agents"

In the prepareAgents method, the company of each agent must be the _id of the company and not the Object company. Your code should look like:

for (var i = 0; i <= agents.length - 1; i++) {
    agents[i].roles = [agents[i].role];
    agents[i] = new Agent(agents[i]);
    agents[i].company = company._id; //here is the problem
}

Try it, maybe i'm wrong.

this is not the source of the problem, but when i delete the agents collection from the Company Model it works, this line cause the problem:

   agents: [{
     type: Schema.ObjectId,
     ref: 'Agent'
   }]

我通过使用其他名称重命名代理集合来解决问题:)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM