MySQL db中定义的以下结构
- 我有一个学位表,包含两列:degree_id,degree_name
醇>
2.分支的另一个表
branch_id,branch_name,degree_id
3.主题表
subject_id,SUBJECT_NAME,subject_code,degree_id,学期
4.syllabus
syllabus_id,syllabus_name,sort_note,attachment,semester,degree_id,branch_id,subject_id
现在我可以轻松地使用mysql获取特定学位,分支,学期的教学大纲,但我是mongo db中的新手请帮忙
答案 0 :(得分:0)
在MongoDb
中,你必须更加概括这个概念并包含其中的所有关系。
您的数据库Mysql
在mongodb
上显示如下:
degree{
_id : ...,
name : ...,
branches :[ {
_id: ...
name: ....,
syllabus : [ {
_id: ...,
name: ....,
sort_note: ....
attachment:...
semetster,...
} , .. ],...{
} ],
subjects: [ {
_id: ..,
name: ....,
code: .....,
semester: ....
}, ...]
}
如果id_branch和id_degree是uniques,就像一个对象,那么对象就是一个数组。
此致
答案 1 :(得分:0)
我查看了SQL的数据模型,对我而言,有些事情并不十分清楚。 您似乎将学位添加到每个集合(分支/主题/教学大纲)。
我猜你最终会在最高级别的degree_id(branch_id / subject_id)上查询你的教学大纲,例如
select * from syllabus where degree_id = ?
或
select * from syllabus where branch_id = ?
这意味着你不要通过像这样的分支或主题上设置的degree_id搜索教学大纲
select s.* from syllabus s
join branch b on b.branch_id = s.branch_id
join subject su on su.subject_id = s.subject_id
where b.degree_id = ? // or su.degree_id = ?
所以,让我们假设您通过为课程提纲记录设置的degree_id搜索您的课程提纲集。 它使得在MongoDB中获得相同结果变得更容易。
将当前SQL模型转换为MongoDB模型的最简单方法是,您可以拥有4个集合而不是4个表。
度
{
degree_id : ...
degree_name : ...
}
分支
{
branch_id : ...
branch_name : ...
degree : {
degree_id : ...
degree_name : ...
}
}
对于受试者而言,并且最终以相同的方式将课程,分支和主题文档嵌入到教学大纲文档中。 MongoDB不需要固定关系或外键,也没有关系数据库中的JOINS。因此,您要么嵌入其他集合,要么通过_id字段添加对文档的引用(就像SQL一样),具体取决于查询结果最终应该是什么样。
嵌入其他集合,您的课程提纲集将如下所示
[
{
_id : ObjectId('syllabus_id_1'), //_id or syllabus_id but MongoDB adds an _id field automatically,
syllabus_name : 'syllabus1',
sort_note : 'a note',
attachment : 'my attachment',
semester : 'semester1',
degree : {
degree_id : ObjectId('degree_id_1'),
degree_name : 'degree1'
},
branch : {
branch_id : ObjectId('branch_id_1'),
branch_name : 'branch1',
degree : {
degree_id : ObjectId('degree_id_1'),
degree_name : 'degree1'
}
},
subject : {
subject_id : ObjectId('subject_id_1'),
subject_name : 'subject1',
subject_code : 'code',
semester : 'semester1',
degree : {
degree_id : ObjectId('degree_id_1'),
degree_name : 'degree1'
}
}
}
]
通过这种方式,您可以像这样查询您的课程提纲集
syllabus.find({'degree.degree_id':ObjectId('degree_id_1'), 'degree.degree_name':'degree1'})
或
syllabus.find({'branch.branch_id':ObjectId('branch_id_1'), 'branch.branch_name':'branch1'})
或者您链接到仅包含_id字段的其他集合,在这种情况下,您的课程提纲文档将如下所示
[
{
_id : ObjectId('syllabus_id_1'), //or syllabus_id but MongoDB adds an _id field automatically,
syllabus_name : 'syllabus1',
sort_note : 'a note',
attachment : 'my attachment',
semester : 'semester1',
degree : ObjectId('degree_id_1'),
branch : ObjectId('branch_id_1'),
subject : ObjectId('subject_id_1'),
}
]
你只能通过像这样的id字段查询你的课程提纲
syllabus.find({degree:ObjectId('degree_id_1')})
或
syllabus.find({degree:ObjectId('branch_id_1')})
我希望您理解这个概念,并决定哪种方法更适合您的应用。这完全取决于您的查询结果中您的教学大纲文档应该是什么样的。
在我的应用程序中,我总是首先考虑查询,然后对我的文档进行建模。
你应该始终记住,你没有JOINS,有插件可以为你提供某种连接和预定义的模型布局,如Mongoose。但在我看来,这完全违背了MongoDB的内容。尝试以MongoDB方式建模数据: - )
如果不清楚,请告诉我。