簡體   English   中英

mongodb 使用nodejs和express的一對多關系

[英]mongodb one to many relationship using nodejs and 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) => {
}

我知道填充可用於將文檔推送給孩子。 提供的任何幫助將不勝感激

店鋪參考

首先,在createCompany controller 中創建Company時,您應該在users數組中添加 user _id ,如下所示:

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
  });

然后,當您創建Project時,在createProject controller 中添加剛剛創建的Company的 _id,如下所示:

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。 為此,如果您創建了一個用戶,您應該在user數組中通過推送(實際上是addToSet )新用戶_id 來更新相應的公司。

例子:

要在 controller 中創建用戶,請一一同步運行兩個腳本:

  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
  });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM