【问题标题】:mongodb one to many relationship using nodejs and expressmongodb使用nodejs和express的一对多关系
【发布时间】:2021-07-30 16:02:23
【问题描述】:

我很难弄清楚这一点。 我要解决的问题是: 我有拥有公司列表的用户, 该公司有项目列表等。

我正在尝试使用引用在 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) => {
}

我了解 populate 可用于将文档推送给孩子。我们将非常感谢您提供的任何帮助

【问题讨论】:

    标签: node.js mongodb express


    【解决方案1】:

    商店参考

    首先,在createCompany 控制器中创建Company 时,您应该在users 数组中添加用户_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 控制器中添加刚刚创建的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
      });
    

    更新参考

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

    例子:

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

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

    【讨论】:

    • 非常感谢您的回答@rahul。但我认为我应该像这样通过updateCompany Company.update(updateCompany(err, done))?。好吧,我是这样做的,但得到了ReferenceError: user is not defined。请协助。谢谢
    • 以上两个任务需要一一运行。首先,创建一个用户,然后将用户 _id 传递给companyUpdate 对象。你可以使用async.waterfall method一一运行
    • 我犯了一个错误,我在更新文档时没有添加过滤器。我已经更新了Company.update,第一个参数作为过滤器对象{_id: req.body.companyId}
    • 除了 [async-waterfall-method] 之外,我已经尝试了您建议的所有方法。但是我得到了用户文档中的公司数组和公司文档中的用户数组,每个都设置为 0 null。但我仍然收到上面提到的错误。我还想提一下,我以前没有这样做过,任何进一步的帮助将不胜感激。谢谢@rahul。
    • 错误即将到来,因为您创建了user,但没有将其传递到更新公司的下一阶段。请参阅此example 我首先创建一张卡片和更新列表,其中卡片详细信息与您的情况相同
    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 2019-08-23
    相关资源
    最近更新 更多