猫鼬处理关系表

时间:2014-08-24 13:24:32

标签: mysql node.js mongodb

我正在从mysql迁移到mongodb。现在我对如何将下面的模式转换为MongoDB或如何查询大学课程感到困惑。 的 MySQL的:

college(college_id,name)
course_college(college_id,course_id)
course(course_id,name)

蒙戈:

大学收藏

{
    "college_id" : "1",
    "name" : "Oxford ",

}

关系:

{
    "college_id" : "1",
    "course_id" : "1",

}, {
    "college_id" : "9",
    "course_id" : "67",
},

课程集

{
    "course_id" : "1",
    "name" : "Master of Computer Applications ",

}
{   
    "course_id" : "2,
    "name" : "Bachelor of Computer Applications ",

}

我需要 mongoose查询获得大学课程这段关系。然后我转换成非关系模式。

2 个答案:

答案 0 :(得分:2)

MongoDB不是关系数据库,因此当您拥有关系数据时,它不是一种合适的技术。当您决定从关系数据库迁移到MongoDB时(通常不是一个好主意),您需要更改数据结构的方式。

文档数据库中的关系集合通常不是一个好主意,因为从一个查询中获取数据无法在单个查询中完成,就像在关系数据库中使用JOIN一样。

更好的解决方案是在学院文档中创建一个数组字段,其中包含大学提供的所有课程,或者在课程文档中创建一个嵌入所有学院的数组字段。您选择哪个选项取决于哪个用例在您的应用程序中更为重要:列出一所大学及其所有课程,或列出一个课程与所有提供它的大学。如果两个用例都很重要,您可以考虑同时执行这两种操作。

请注意,您不一定需要嵌入整个文档。您的选择范围从嵌入整个文档,只嵌入最重要的嵌入_id的字段,以便需要通过附加查询获得所有进一步的信息。您在这方面做出的选择取决于子文档的哪些字段需要满足您最常见的用例。

答案 1 :(得分:0)

谢谢@Philipp

这里的MongoDB就像MySQL Relation一样。

我为紧急情况尝试了一个解决方案

var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var CollegeSchema = mongoose.Schema({
    college_name   : String
});

var College =  mongoose.model('College', CollegeSchema);


var CourseCollegeSchema = mongoose.Schema({
    college_id         : {type: Schema.ObjectId, ref: 'College' }
  , course_id    : {type: Schema.ObjectId, ref: 'Course' }
});

var CourseCollege = mongoose.model('CourseCollege', CourseCollegeSchema);

var CourseSchema = mongoose.Schema({
    course_name    : String
});

var Course = mongoose.model('Course', CourseSchema);

<强>查询

// For searching colleges related to a course 
CourseCollegeSchema.find({college_id:"53f9ee7ac3130d4816b858ef"}).populate('course_id').exec(function(err, courses){console.log(courses);})

// For searching colleges related to a course 
CourseCollegeSchema.find({course_id:"53f9efe4b6ba1a8022f6acdd"}).populate('college_id').exec(function(err, colleges){console.log(colleges);})