优势说明
mongoDB作为文档型数据库,比关系型数据库更加擅长存放复杂类型的数据。关系型数据库在定义表结构时三范式要求每一个单元格数据表示的信息是不可以再分割的。而mongoDB则是运行集合下的属性可以是一个数据项一个对象或者是一个数组。
使用场景
用关系型数据库来记录(文章,评论,点赞信息,文章附件)信息时我们需要建立四张表来维持它们之间的关系。分别是文章表,评论表,点赞表,附件表,其中评论表、点赞表和附件表都持有文章表主键。而使用mongoDB时我们只需要一个文章集合就可以,这个集合包括,文章内容属性,文章发表时间属性,文件状态属性,评论数组属性,点赞数组属性,文章附件数组属性。
这样的系统通常的操作是先查询文章列表,再根据用户选择查询某一篇文章的详细信息,详细信息中包括文章内容,附件,点赞信息和评论信息。这样的需要使用关系型数据库也可以很好地胜任,只是在查询详细信息时使用关联从四个表中获取数据。但是我们如果把需求再提升一下,我们需要在文章列表中就展示文章内容、评论、附件和点赞信息,这样的需要也是存在的,比如微信的朋友圈就是这样。这是使用关系型数据库就有些不那么方便了,需要先从文章表中查询出文章列表,在根据每一个文章的主键到其他表中获取信息。这时如果列表要求显示10条记录,就需要执行11次的sql语句。而在这样的需求下mongoDB任然是只需要执行一次查询就可以获取到全部数据。
需要克服的问题
大部分的同行对关系型数据使用的熟练度大大地高于mongoDB的熟练度,所有在使用mongoDB开发以上需要的系统时,需要克服以下几个问题。
新增数据
使用脚本操作
db.message.insert({
"_id" : 5.0,
"content" : "心情超级很好,这是美好的一天。。。",
"createTime" : ISODate("2018-05-24T12:45:43.302+08:00"),
"userName" : "caifu",
"attachments" : [
{
"url" : "http://test123/123.jpg",
"name" : "123.jpg"
},
{
"url" : "http://test123/1234.jpg",
"name" : "1234.jpg"
}
]
})
使用JAVA操作
import org.springframework.data.mongodb.core.MongoTemplate;
mongoTemplate.insert(message,"message");
向文章中添加评论
使用脚本操作
db.message.update(
{ _id: 5 },
{ $addToSet: { comments: {
"_id":"123245",
"user" : "cai",
"createTime" : ISODate("2018-05-29T10:32:46.209+08:00"),
"content":"一起出去玩呀",
"status":0
} } }
)
使用JAVA操作
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import o