mysql到mongodb数据库和查询转换

时间:2016-10-13 07:18:44

标签: mongodb

MySQL db中定义的以下结构

  
      
  1. 我有一个学位表,包含两列:degree_id,degree_name
      2.分支的另一个表
      branch_id,branch_name,degree_id
      3.主题表
      subject_id,SUBJECT_NAME,subject_code,degree_id,学期
      4.syllabus
  2.   
syllabus_id,syllabus_name,sort_note,attachment,semester,degree_id,branch_id,subject_id

现在我可以轻松地使用mysql获取特定学位,分支,学期的教学大纲,但我是mongo db中的新手请帮忙

2 个答案:

答案 0 :(得分:0)

MongoDb中,你必须更加概括这个概念并包含其中的所有关系。

您的数据库Mysqlmongodb上显示如下:

     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方式建模数据: - )

如果不清楚,请告诉我。