我必须在单独的文件中定义不同的mongodb模型吗?

时间:2019-06-23 10:19:11

标签: javascript node.js mongodb

最近,我一直在使用单一模型处理mongodb。当我尝试添加第二个模型时,我注意到我可能会遇到一些问题。 首先,这是一个模型的代码:

  

riskRating.js

const mongoose = require('mongoose')
const Schema = mongoose.Schema;
let riskRatingRow = new Schema({
  securitycause: {
    type: String
  },
  operationalrisk: {
    type: String
  },
  riskid: {
    type: String
  },
  riskstatements: {
    type: String
  },
  businessline: {
    type: String
  },
  supportingasset: {
    type: String
  },
  category: {
    type: String
  },
  frequency: {
    type: String
  },
  impact: {
    type: String
  },
  inherentriskrating: {
    type: String 
  },
  controleffectiveness: {
    type: String
  },
  residualrisk: {
    type: String
  }
});
module.exports = mongoose.model('riskRating', riskRatingRow);

这是我在服务器代码中使用它的方式:

  

server.js

   const RiskRatingRow= require('./models/riskRating');
    router.route('/table').get((req, res) => {
        RiskRatingRow.find((err, tableData) => {
            if (err)
                console.log(err);
            else
                res.json(tableData);
        });
    });

router.route('/table/add').post((req, res) => {
    console.log('REQ.body is ', req.body);
    const riskRatingRow = new RiskRatingRow(req.body);
    riskRatingRow.save()
        .then(issue => {
            res.status(200).json({
                'tableRow': 'Added successfully'
            });
        })
        .catch(err => {
            res.status(400).send('Failed to create new record');
        });
});

第一个问题:到目前为止有什么问题吗?
现在,当我添加第二个模型时:

  

twoModels.js

const mongoose = require('mongoose')
const Schema = mongoose.Schema;
let riskRatingRow = new Schema({
    //1st model defintion
});
const businessLineDashboardRow = new Schema({
    //2nd model defintion
});
module.exports = mongoose.model('businessLineDashboard', businessLineDashboardRow);
module.exports = mongoose.model('riskRating', riskRatingRow);

我注意到在server.js中,当我使用第一个模型时,我没有直接引用它。我宁愿引用singleModel.js文件。特别是在这两行中:

   const RiskRatingRow = require('./models/riskRating');
   // Here I am using directly the file reference RiskRatingRow 
   const riskRatingRow = new RiskRatingRow(req.body);
   // Same thing here
        RiskRatingRow.find((err, tableData) => {
            if (err)
                console.log(err);
            else
                res.json(tableData);
        });

因此,当我要使用第二个模型时,我发现自己被挡住了,因为正如我在使用第一个模型时所解释的那样,我没有直接引用它。我刚刚引用了文件。
事实是,这真的很好。
但是,我不知道模型文件是否包含两个模型,我应该如何在服务器文件中同时使用这两个模型。
这是我的另外两个问题:
1 /即使我只是引用模型定义文件,该代码如何工作?
2 /我是否应该在单独的文件中定义第二个模型,然后引用它以便能够使用它?
谢谢,我希望我足够清楚。

2 个答案:

答案 0 :(得分:1)

module.exports可以是包含多个属性的对象:

module.exports = {
  RiskRatingRow: mongoose.model('businessLineDashboard', businessLineDashboardRow),
  BusinessLineDashboardRow: mongoose.model('riskRating', riskRatingRow),
}

由于默认情况下它是一个空对象({}),您可以也分别分配导出内容:

module.exports.RiskRatingRow = mongoose.model('businessLineDashboard', businessLineDashboardRow)
module.exports.BusinessLineDashboardRow = mongoose.model('riskRating', riskRatingRow)

您现在可以destructureserver.js内的对象之外进行建模:

const { RiskRatingRow, BusinessLineDashboardRow } = require('./models/twoModels')

或者,如果您想采用传统方法:

const models = require('./models/twoModels')
const RiskRatingRow = models.RiskRatingRow
const BusinessLineDashboardRow = models.BusinessLineDashboardRow

答案 1 :(得分:0)

尼古拉斯的答案是正确的。但是,我找到了一个更完整的解决方案:

  

riskRating.js

const mongoose = require('mongoose')
const Schema = mongoose.Schema;
module.exports = function(mongoose) {
  let riskRatingRow = new Schema({
    securitycause: {
      type: String
    },
    operationalrisk: {
      type: String
    },
    riskid: {
      type: String
    },
    riskstatements: {
      type: String
    },
    businessline: {
      type: String
    },
    supportingasset: {
      type: String
    },
    category: {
      type: String
    },
    frequency: {
      type: String
    },
    impact: {
      type: String
    },
    inherentriskrating: {
      type: String 
    },
    controleffectiveness: {
      type: String
    },
    residualrisk: {
      type: String
    }
  });
  let businessLineDashboardRow = new Schema({
    ref: {
      type: String
    },
    riskstatements: {
      type: String
    },
    maximpact: {
      type: String
    },
    controleffectiveness: {
      type: String
    },
    recommendedriskrating: {
      type: String
    },
    frequency: {
      type: String
    },
    impact: {
      type: String
    },
    validatedreviewriskrating: {
      type: String
    },
    rationalforriskadjustment: {
      type: String
    }
  });

  var models = {
    BusinessLineDashboard : mongoose.model('BusinessLineDashboard', businessLineDashboardRow),
    RiskRating : mongoose.model('RiskRating', riskRatingRow)
  };
  return models;
}
  

server.js

router.route('/riskRating2').get((req, res) => {
    models.RiskRating.find((err, tableData) => {
        if (err)
            console.log(err);
        else
            res.json(tableData);
            analyseDeRisqueService.determineMaxImpactForEachRisk(tableData)

    });
});