Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用nodejs和express的mongodb一对多关系_Node.js_Mongodb_Express - Fatal编程技术网

Node.js 使用nodejs和express的mongodb一对多关系

Node.js 使用nodejs和express的mongodb一对多关系,node.js,mongodb,express,Node.js,Mongodb,Express,这对我来说是一段艰难的时光。 我试图解决的问题是: 我有一些拥有公司列表的用户, 这家公司有项目清单等 我正在尝试使用引用创建一个公司下的项目和一个用户下的公司。 此用户将从公司项目的表单字段填充 用户模式 const mongoose = require('mongoose'); const Schema = mongoose.Schema; //============= User Schema============// const userSchema = new Schema({

这对我来说是一段艰难的时光。 我试图解决的问题是: 我有一些拥有公司列表的用户, 这家公司有项目清单等

我正在尝试使用引用创建一个公司下的项目和一个用户下的公司。 此用户将从公司项目的表单字段填充

用户模式

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
控制器中创建
Company
时,应在
users
数组中添加用户
\u id
,如下所示:

const CompanyData={
公司名称:req.body.company\U名称,
users:[req.body.userId]//假设用户_id进入请求体
}
Company.create(companyData,(err,done)=>{
//你的代码
});
然后,当您创建一个
项目
时,在
创建项目
控制器中添加刚刚创建的
公司
的id,如下所示:

const projectData={
项目名称:req.body.project名称,
company:[req.body.compnyid]//再次假设,company\u id出现在请求正文中
}
Projects.create(projectData,(err,done)=>{
//你的代码
});
更新引用 另外,正如我在您的模式中看到的,您正试图保持它的双向性,就像公司文档中的用户ID和用户文档中的公司ID一样。 为了实现这一点,如果您创建了一个用户,您应该在
user
数组中使用push(
addToSet
实际上)new user\u id更新相应的公司

例如:

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

  • 创建具有公司id和其他详细信息的用户
  • const数据={
    名称:req.body.name,
    电子邮件:req.body.email,
    公司:[请求正文.公司ID]
    }
    创建(数据,(错误,完成)=>{
    //你的代码
    });
    
  • 用新创建用户的_id更新公司单据(其_id保存在上述用户中)
  • const updateCompany={“$addToSet”:{user:user.\u id};//从上面的同步脚本中获取“user.\u id”
    Company.update({u id:req.body.companyId},数据,(err,done)=>{//Updated filter
    //你的代码
    });
    
    非常感谢您的回答@rahul。但我想我应该通过
    updateCompany
    ,比如
    Company.update(updateCompany(err,done))
    ?。好的,我这样做了,但是得到了一个
    引用错误:用户未定义
    。请帮忙。感谢您需要逐一运行上述两个任务。首先,创建一个用户,然后获取用户id并传递到
    companyUpdate
    对象中。您可以使用“我犯了一个错误,在更新文档时没有添加筛选器”逐个运行。我已经用第一个参数作为筛选对象更新了
    Company.update
    {{u id:req.body.companyId}
    除了[async瀑布方法]之外,我已经尝试了您建议的所有方法。但是我在用户文档中得到了公司数组,在公司文档中得到了用户数组,每个数组都设置为0 null。但是我仍然得到上面提到的错误。我还想提一下,我以前从未这样做过,任何进一步的帮助都将不胜感激。谢谢@rahul.Error即将到来,因为您已经创建了
    用户
    ,但没有将其传递到下一个阶段,即更新公司。在这里,我首先创建一张卡,并更新与您的情况相同的卡详细信息列表