node.js - 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) => {
}
我知道填充可用于将文档推送给孩子。提供的任何帮助将不胜感激
解决方案
店铺参考
首先,在创建Company
内部createCompany
控制器时,您应该像这样_id
在users
数组中添加用户:
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,如下所示:Company
createProject
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
例子:
要在控制器中创建用户,请一一同步运行两个脚本:
- 使用公司 _id 和其他详细信息创建用户。
const data = {
name: req.body.name,
email: req.body.email,
company: [req.body.companyId]
}
Users.create(data, (err, done) => {
// Your code
});
- 使用新创建用户的 _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
});
推荐阅读
- python - 获取 TypeError:“int”类型的参数在 Python 中不可迭代
- css - 基于 HTML 文档的 lang 属性的自定义 CSS
- jquery - DateTime 验证的 RangeAttribute 在 MVC Web 应用程序中不起作用
- elasticsearch - 弹性搜索 | 以相同分数随机化结果
- python - python numba.guvectorize 失败:“LV:由于内存冲突而无法矢量化”
- sql - 相同的 SQL,在 Sybase 和 SQL Server 中的结果不同
- javascript - Javascript XPath 表循环 td
- java - 带有自定义注解的构造函数 bean 注入
- javascript - 无法使用函数更新 React Context 中的状态
- php - PHP面包屑数组,链接未满