首页 > 解决方案 > mongodb使用nodejs和express的一对多关系

问题描述

对我来说,试图弄清楚这一点是一段艰难的时期。我要解决的问题是:我的用户有公司列表,这个公司有项目列表等。

我正在尝试使用引用在 COMPANY 下创建 PROJECT 并在 USER 下创建 COMPANY。此 USER 将从表单字段中填充,同样是 COMPANY PROJECT

用户模式

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

//============= User Schema============//
const userSchema = new Schema({
name: String,
email: String,

//referencing user's company/companies
company: [
    {
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'company',
    },
],  
},{
timestamps: true
});

const Users = mongoose.model('user', userSchema);
module.exports = Users;

公司架构

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

//======== Company schema ========//
const compSchema = new Schema({
company_name: String,

//referencing user schema
user: [
  {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'user',
  },
],

//referencing projects
projects: [
    {
      type: mongoose.Schema.Types.ObjectId, 
      ref: 'project',
    },
  ],
},{
  timestamps: true
});

const Company = mongoose.model('company', compSchema);
module.exports = Company;

项目架构

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

//PROJECT SCHEMA
 const projectSchema = new Schema({
 project_title: String,
 
 //referencing company schema
 company: [
   {
     type: mongoose.Schema.Types.ObjectId,
     ref: 'company',
   }
 ],
},{
timestamps: true
});

const Projects = mongoose.model('project', projectSchema);
module.exports = Projects;

控制器

 const Users = require('./userSchema');
 const Company = require('./companySchema');
 const Projects = require('./projectSchema');

 //create user
exports.createUser = async (req, res) => {
  const data = {
   name: req.body.name,
   email: req.body.email,
  }
  Users.create(data, (err, done) => {
    if(err) return err;
    res.json({UserData: done});
    return;
  });
}
exports.getAllUsers = async(req, res) => {
}

 //create company
exports.createCompany = async (req, res) => {
   const CompanyData = {
   company_name: req.body.company_name,
  }
  Company.create(companyData, (err, done) => {
    if(err) return err;
    res.json({CompanyDetails: done});
    return;
  });
}
exports.getllCompany = async (req, res) => {
}

//create project
exports.createProject = async (req, res) => {
  const projectData = {
   project_title: req.body.project_title,
  }
  Projects.create(projectData, (err, done) => {
    if(err) return err;
    res.json({ProjectDetails: done});
    return;
  });
}
exports.getAllProjects = async (req, res) => {
}

我知道填充可用于将文档推送给孩子。提供的任何帮助将不胜感激

标签: node.jsmongodbexpress

解决方案


店铺参考

首先,在创建Company内部createCompany控制器时,您应该像这样_idusers数组中添加用户:

const CompanyData = {
    company_name: req.body.company_name,
    users: [req.body.userId]    // Lets assume, user _id is coming in request body
  }
  Company.create(companyData, (err, done) => {
    // Your code
  });

然后,当您创建_id 时,在控制器Project中添加刚刚创建的 _id,如下所示:CompanycreateProject

const projectData = {
    project_title: req.body.project_title,
    company: [req.body.comapnyId]   // Again assuming, company _id is coming in request body
  }
  Projects.create(projectData, (err, done) => {
    // Your code
  });

更新参考

此外,正如我在您的架构中看到的那样,您正试图保持它是双向的,例如公司文档中的用户 _ids 和用户文档中公司的 _ids。为了实现这一点,如果你创建了一个用户,你应该在数组中推送(addToSet实际上)新用户_id来更新相应的公司。user

例子:

要在控制器中创建用户,请一一同步运行两个脚本:

  1. 使用公司 _id 和其他详细信息创建用户。
const data = {
   name: req.body.name,
   email: req.body.email,
   company: [req.body.companyId]
  }
  Users.create(data, (err, done) => {
    // Your code
  });
  1. 使用新创建用户的 _id 更新公司文档(其 _id 保存在上述用户中)。
const updateCompany = { "$addToSet": { user: user._id } };   // Get `user._id` from above synchronous script
   
  Company.update({_id: req.body.companyId}, data, (err, done) => {  // Updated filter
    // Your code
  });

推荐阅读