mongodb是非关系型、文档数据库,数据形式Bson
myql扩容时配置要求高、成本高
nosql自动水平扩容操作简单
高可扩展性
分布式计算
低成本
架构的灵活性,半结构化数据
没有复杂的关系
没有标准化
有限的查询功能(到目前为止)
最终一致是不直观的程序
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于
JSON 对象。字段值可以包含其他文档,数组及文档数组。

非关系型数据库,基于 Document data model (文档数据模型)
MongoDB以 BSON (BinaryJSON) 格式存储数据,类似于 JSON 数据形式
关系型数据库使用 table (tables of rows)形式存储数据,而MongoDB使用 collections
(collections of documents)
支持 临时查询( ad hoc queries ): 系统不用提前定义可以接收的查询类型
索引通过 B-tree 数据结构, 3.2版本的WiredTiger 支持 log-structured merge-trees(LSM)
支持索引和次级索引( secondary indexes ): 次级索引是指文档或row有一个 主键( primary key )作为索引,同时允许文档或row内部还拥有一个索引,提升查询的效率,这也是MongoDB比
较大的一个特点
在mongodb中基本的概念是文档、集合、
数据库

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
server:
port: 8080
spring:
application:
name: spring-boot-test
data:
mongodb:
database: test
host: 192.168.10.30
port: 27017
Blog类
@Document("blog")
public class Blog {
@Id
private String id;
private String title;
private String by;
private String url;
private List<String> tags;
private int likes;
setter getter ....
}
DAO类
@Component
public class BlogDao {
@Autowired
private MongoTemplate mongoTemplate;
public void insert(Blog blog) {
mongoTemplate.insert(blog);
}
public Blog findByID(String id) {
return mongoTemplate.findById(id, Blog.class);
}
public void deleteByID(String id) {
mongoTemplate.remove(Query.query(Criteria.where("_id").is(id)), Blog.class);
}
public List<Blog> find(Blog blog) {
if (null == blog) {
return null;
}
Criteria criteria = getFilter(blog);
return mongoTemplate.find(Query.query(criteria), Blog.class);
}
public Criteria getFilter(Blog blog) {
Criteria criteria = new Criteria();
if (!StringUtils.isEmpty(blog.getTitle())) {
criteria.andOperator(Criteria.where("title").is(blog.getUrl()));
}
if (!StringUtils.isEmpty(blog.getBy())) {
criteria.andOperator(Criteria.where("by").is(blog.getBy()));
}
if (!StringUtils.isEmpty(blog.getLikes())) {
criteria.andOperator(Criteria.where("likes").is(blog.getLikes()));
}
if (null != blog.getTags() && !blog.getTags().isEmpty()) {
criteria.andOperator(Criteria.where("tags").in(blog.getTags()));
}
return criteria;
}
}
@RestController
@RequestMapping("/blog")
public class WebController {
@Resource
private BlogDao blogDao;
@RequestMapping("/{id}")
@ResponseBody
public String getBlogInfo(@PathVariable("id") String id) {
Blog blog = blogDao.findByID(id);
if (null == blog) {
return "访问的数据不存在";
}
return JSON.toJSONString(blog);
}
@RequestMapping("/add")
@ResponseBody
public String addBlog(@RequestBody Blog blog) {
blogDao.insert(blog);
return JSON.toJSONString(blog);
}
public void batchAdd(){
}
}
测试结果
