NoSQL可以极大提高互联网系统的性能,但是它有一些致命的缺陷,其中最为严重的就是计算功能卡分有限,例如,在一个10 万数据量的List 中,我只需要满足特定条件的元素在Red is 中,使用集合或者列表,你只有先把元素取出,然后才能通过条件筛选一个个得到你想要的数据,这显然存在比较大的问题

Reids中,对于那些需要缓存而且经常需要统计、分析和查询的数据, 显然就不是那么便捷。

这就需要MongoDB来实现了,需要统计、按条件查询和分析的数据,它提供了支持,它可以说是一个最接近于关系数据库的NoSQL 。

MongoDB的特点:将数据存储为一个文档,数据结构由键值( key-value )对组成。

这里的Mongo DB 文档类似于JSON 数据集,所以很容易转化成为Java POJO 对象或者JavaScript 对
象,这些字段值还可以包含其他文档、数组及文档数组

需要加入mongoDB-starter依赖

<!--加入mongodb依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>

如果用到json的操作,还可以引入阿里巴巴的fastjson的开发包

springboot为我们自动创建的mongoDB的Bean:

向配置文件加入mongodb配置

编写一个和mongodb文档对应要存储的实体类:

@Document
public class User implements Serializable { private String id;
private String name;
private Integer age;
private Integer grade; public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Integer getGrade() {
return grade;
} public void setGrade(Integer grade) {
this.grade = grade;
} @Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", age=" + age +
", grade=" + grade +
'}';
}
}

可能使用的注解包括以下内容

@Id - 文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器
  (确保同一秒内产生的Id不会冲突)构成。 @Document - 把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档。
      @Document(collection=“mongodb”) mongodb对应表 @DBRef - 声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象
    里面的值时,单独保存本实例并不能保存DERef引用的对象,
    它要另外保存,如下面例子的Person和Account。 @Indexed - 声明该字段需要索引,建索引可以大大的提高查询效率。 @CompoundIndex - 复合索引的声明,建复合索引可以有效地提高多字段的查询效率。 @GeoSpatialIndexed - 声明该字段为地理信息的索引。 @Transient - 映射忽略的字段,该字段不会保存到mongodb。 @PersistenceConstructor - 声明构造函数,作用是把从数据库取出的数据实例化为对象。

 注意:因为数据库的规范采用下划线分隔,二java一般采用驼峰式命名,所以可以使用@Field进行设置

指定该属性在mongodb里面使用的保存名字 

插入一条记录:

cotroller:

  @Autowired
UserService service; //http://localhost:8988/insert?id=110&name=quan&age=222&grade=223
@RequestMapping("/insert")
public User insertUser(User user){
// User user = new User();
// user.setAge(23);
//
// user.setGrade(98);
// user.setName("quqquq");
service.insertUser(user);
return user;
}

UserService接口:

public interface UserService {
public void insertUser(User user);

UserServiceImpl接口:

注意:这里需要标注@Service和定义扫描的包,spring才会将它自动装配进来

MongoTemplate不需要自己创建,只需要在配置文件中配置和mongo'db相关内容就行

@Service
public class UserServiceImpl implements UserService{
@Autowired
private MongoTemplate mongoTemplate; @Override
public void insertUser(User user) {
mongoTemplate.insert(user);
}

注意:mongoTemplate.save(user) 也是可以进行mongodb的存储的。

save和insert的区别:

若增加的数据的主键已经存在,insert会抛出一个主键重复的异常。不会保存数据

而save会直接对已经存在的数据进行修改。

删除:

    public DeleteResult deleteUser(String id);
    /**
* 1使用主键构建出一个准则,
* 2使用MongoTemplate的remove方法进行删除操作
* 3返回一个DeleteResult对象,记录此次操作记录。
* 属性deletedCount代表删除文档的条数
* @param id
* @return
*/
    @Override
public DeleteResult deleteUser(String id) {
Criteria criteria = Criteria.where("id").is(id);
Query query = Query.query(criteria);
DeleteResult result =mongoTemplate.remove(query,User.class);
return result;
}

注意:使用remove方法的时候,需要指定文档对应的实体类的class

    @RequestMapping("/delUser/{id}")
public DeleteResult delUser(@PathVariable("id") String id){
return service.deleteUser(id);
}

更新:

    /**
* 1通过构建Query对象确认更新什么内容,这里使用主键确认对应的文档
* 2定义一个更新对象,定义的时候同时设置了对username的更新
* 3通过更新对象的set方法设置相关内容的更新
* 4使用MongoTemplate执行更新。
* 注意:有两个更新方法,updateFirst(只执行第一个确定对象) updateMulti(执行所有确定对象)
* 5更新方法的返回值:
* "matchedCount": Query对象匹配的文档数
* "modifiedCount": 被更新的文档数
* "upsertedId": 如果存在更新而插入文档的情况返回插入文档的信息
* @param user
* @return
*/

这里只给出实现类的方法:

    @Override
public UpdateResult upUser(User user) {
Criteria criteria = Criteria.where("id").is(user.getId());
Query query = Query.query(criteria);
//定义更新对象,随便更新name;
Update update = Update.update("name",user.getName());
update.set("age",user.getAge());
update.set("grade",user.getGrade()); UpdateResult updateResult = mongoTemplate.updateFirst(query,update,User.class);
return updateResult;
}

一开始:

请求之后:

结果:

spring-boot-learning-MongoDB的更多相关文章

  1. springboot(十一):Spring boot中mongodb的使用

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...

  2. (转)Spring Boot(十一):Spring Boot 中 MongoDB 的使用

    http://www.ityouknow.com/springboot/2017/05/08/spring-boot-mongodb.html MongoDB 是最早热门非关系数据库的之一,使用也比较 ...

  3. Spring Boot(十一):Spring Boot 中 MongoDB 的使用

    MongoDB 是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配 ...

  4. 使用spring boot访问mongodb数据库

    一. spring boot中传参的方法 1.自动化配置 spring Boot 对于开发人员最大的好处在于可以对 Spring 应用进行自动配置.Spring Boot 会根据应用中声明的第三方依赖 ...

  5. MongoDB最简单的入门教程之四:使用Spring Boot操作MongoDB

    Spring Boot 是一个轻量级框架,可以完成基于 Spring 的应用程序的大部分配置工作.Spring Boot的目的是提供一组工具,以便快速构建容易配置的Spring应用程序,省去大量传统S ...

  6. Spring Boot开发MongoDB应用实践

    本文继续上一篇定时任务中提到的邮件服务,简单讲解Spring Boot中如何使用MongoDB进行应用开发. 上文中提到的这个简易邮件系统大致设计思路如下: 1.发送邮件支持同步和异步发送两种 2.邮 ...

  7. spring boot(十一)MongoDB的使用

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...

  8. SpringBoot(十一):Spring boot 中 mongodb 的使用

    原文出处: 纯洁的微笑 mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 ...

  9. 记一次spring boot中MongoDB Prematurely reached end of stream的异常解决

    在spring boot项目中使用了mongodb,当一段时间没有操作mongodb,下次操作mongodb时就会出现异常.异常如下: org.springframework.data.mongodb ...

  10. Spring boot整合Mongodb

    最近的项目用了Mongodb,网上的用法大多都是七零八落的没有一个统一性,自己大概整理了下,项目中的相关配置就不叙述了,由于spring boot的快捷开发方式,所以spring boot项目中要使用 ...

随机推荐

  1. RIP协议测试——信而泰网络测试仪实操

    一.简介: RIP(Routing Information Protocol,路由信息协议)是一种内部网关协议(IGP),是一种动态路由选择协议,用于自治系统(AS)内的路由信息的传递.RIP协议基于 ...

  2. 推荐几款顶级的数据可视化及大数据分析BI工具

    如今,有大量强大的可视化工具可用于表达想法.可视化数据.向客户和全球社区分享重要的分析结果.现在大大小小的企业都可以利用商业智能工具来理解复杂的大数据. 这些解决方案可以收集,分析这些数据并将其转换为 ...

  3. [MethodImpl(MethodImplOptions.Synchronized)]与lock机制

    [MethodImpl(MethodImplOptions.Synchronized)]与lock机制 在进行.NET开发时,经常会遇见如何保持线程同步的情况.在众多的线程同步的可选方式中,加锁无疑是 ...

  4. C#析构函数(方法)

    析构方法是在垃圾回收.释放资源时使用的.析构函数用于析构类的实例.备注:    不能在结构中定义析构函数.只能对类使用析构函数.    一个类只能有一个析构函数.    无法继承或重载析构函数.    ...

  5. Python 中的闭包和自由变量

    1.定义 在函数内部再定义一个函数,并且这个函数用到了外部函数的变量(LEGB),最后返回新建函数的函数名索引,那么将这样的能够访问其定义时所在的作用域的函数以及用到的一些变量称之为闭包.被引用的非全 ...

  6. C#中String StringBuilder

    String和StringBuilder和StringBuffer,这三个都是值得深究一翻的,可能很多人会说,实在不行的话,都全部用StringBuilder,啥事没有,我不能说你的想法事不正确的,但 ...

  7. 数仓建模—ID Mapping

    早晨起床的时候,发现自己尿分叉,我没有多想,简单洗洗就匆忙出门.路过早餐店,我看到师傅熟练的拉扯一小块面团,拉至细长条,然后放入油锅中,不一会功夫,一根屎黄色的油条便出锅了,卖相不错.我在想,小到炸屎 ...

  8. Java课程设计---创建数据库工具类

    1.传统的数据库操作 package com.java.mysql; import java.sql.Connection; import java.sql.DriverManager; import ...

  9. logging日志模块、配置字典

    logging日志模块 知识点很多 但是需要掌握的很少(会用即可) import logging # 日志有五个等级(从上往下重要程度不一样) # logging.debug('debug级别') # ...

  10. QUIC协议详解

    声明 本文可以自由转载但需注明原始链接.本文为本人原创,作者LightningStar,原文发表在博客园.本文主体内容参考论文[1]完成. 介绍 QUIC,发音同quick,是"Quick ...