springboot系列十一 Spring-Data-MongoDB

mongodb

MongoDB 是一个基于分布式文件存储的NoSQL数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

数据存储格式相似于jsonhtml

{ 
    "_id" : ObjectId("5c061052f94458c11e167a5a"), 
    "name" : "test", 
    "age" : NumberInt(13), 
    "createTime" : ISODate("2018-12-04T05:27:46.633+0000")
}

官方文档

https://docs.mongodb.com/manual/?_ga=2.34252649.996507481.1543901385-1321775126.1543901385java

官方示例java代码

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import java.util.ArrayList;
import java.util.List;

import com.mongodb.client.model.Indexes;

import static com.mongodb.client.model.Accumulators.sum;
import static com.mongodb.client.model.Aggregates.group;
import static com.mongodb.client.model.Aggregates.match;
import static com.mongodb.client.model.Filters.eq;
import static java.util.Arrays.asList;

public class MongoDBExamples {

   public static void main(final String[] args) {

       // 1. Connect to MongoDB instance running on localhost
       MongoClient mongoClient = new MongoClient();

       // Access database named 'test'
       MongoDatabase database = mongoClient.getDatabase("test");

       // Access collection named 'restaurants'
       MongoCollection<Document> collection = database.getCollection("restaurants");

       // 2. Insert 
       List<Document> documents = asList(
               new Document("name", "Sun Bakery Trattoria")
                       .append("stars", 4)
                       .append("categories", asList("Pizza", "Pasta", "Italian", "Coffee", "Sandwiches")),
               new Document("name", "Blue Bagels Grill")
                       .append("stars", 3)
                       .append("categories", asList("Bagels", "Cookies", "Sandwiches")),
               new Document("name", "Hot Bakery Cafe")
                       .append("stars", 4)
                       .append("categories", asList("Bakery", "Cafe", "Coffee", "Dessert")),
               new Document("name", "XYZ Coffee Bar")
                       .append("stars", 5)
                       .append("categories", asList("Coffee", "Cafe", "Bakery", "Chocolates")),
               new Document("name", "456 Cookies Shop")
                       .append("stars", 4)
                       .append("categories", asList("Bakery", "Cookies", "Cake", "Coffee")));

       collection.insertMany(documents);


       // 3. Query 
       List<Document> results = collection.find().into(new ArrayList<>());


       // 4. Create Index 
       collection.createIndex(Indexes.ascending("name"));
       // 5. Perform Aggregation
       collection.aggregate(asList(match(eq("categories", "Bakery")),
               group("$stars", sum("count", 1))));


        mongoClient.close();

   }

}

支持语言

安装方法

客户端选择

springboot集成mongodb

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

配置

spring:
  data:
    mongodb:
      #uri配置
      #  若是有密码 mongodb://user:pass@localhost:27017/test
      #  若是集群 mongodb://user:pass@ip1:port1,ip2:port2/database
      uri: mongodb://localhost:27017/test

目前spring-data-starter-mongo并无提供链接池配置。如须要本身配置,参考linux

王静茜 Spring Boot中使用MongoDB的链接池配置git

翟永超 Spring Boot中加强对MongoDB的配置(链接池等)spring

使用MongoTemplate

mongoTemplate能够灵活的操做mongodb,如基本的CRUD、统计、聚合等mongodb

简单CURD

实体类docker

public class User {
    private String id;
    private String name;
    private int age = 18;
    private LocalDateTime createTime = LocalDateTime.now();
}

接口测试类数据库

@RestController
public class UserResource {

    @Autowired
    private MongoTemplate mongoTemplate;
    //添加
    @PostMapping("/template/user")
    public User save(@RequestBody User user){
        return mongoTemplate.save(user);
    }
    //查询全部
    @GetMapping("/template/user")
    public List<User> findAll(){
        return mongoTemplate.findAll(User.class);
    }
    //根据姓名查询
    @GetMapping("/template/user/{name}")
    public User findOne(@PathVariable String name){
        return mongoTemplate.findOne(Query.query(Criteria.where("name").is(name)), User.class);
    }
}

测试json

添加一个用户 POST http://localhost:8080/template/userspringboot

查看mongodb

调用查询接口 GET http://localhost:8080/template/user

[
    {
        "id": "5c061052f94458c11e167a5a",
        "name": "test",
        "age": 13,
        "createTime": "2018-12-04T13:27:46.633"
    }
]

根据姓名查询 GET http://localhost:8080/template/user/test

{
    "id": "5c061052f94458c11e167a5a",
    "name": "test",
    "age": 13,
    "createTime": "2018-12-04T13:27:46.633"
}

mongotemplate聚合统计

新建一个实体

@Data
public class Stu {
    private String id;
    private String name;
    private int sex = 1;//1男 2女
    private int age;
    private String grade;//年级
    private String school;//学校
}

添加单元测试,来添加测试数据

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MongoApp.class)
public class StuTest {
    @Autowired private MongoTemplate mongoTemplate;


    Random random = new Random();
    @Test
    public void addStus(){
        List<Stu> list = new ArrayList<>(20);
        for(int i = 0; i<20;i++){
            Stu stu = new Stu();
            stu.setName("学生" + i);
            stu.setSex(i%2 == 0 ? 1 : 2);
            stu.setAge(random.nextInt(20) + 5);
            stu.setGrade((random.nextInt(4) + 1) + "年级");
            stu.setSchool("第" + (random.nextInt(4) + 1) + "学校");
            list.add(stu);
        }
        mongoTemplate.insertAll(list);
    }
}

执行单元测试后,查看mongo的数据

统计的测试接口

/**------------ MongoTemplate 聚合统计 -------------*/

    /**根据自定义字段分组统计*/
    @GetMapping("/template/group/{groupFiled}")
    public Iterator<BasicDBObject> groupBase(@PathVariable String groupFiled){
        Aggregation agg = Aggregation.newAggregation(Aggregation.group(groupFiled).count().as("总人数"));
        AggregationResults<BasicDBObject> res = mongoTemplate.aggregate(agg, "stu", BasicDBObject.class);
        Iterator<BasicDBObject> iterator = res.iterator();
        return iterator;
    }

    /**按条件,根据多个字段分组*/
    @GetMapping("/template/group")
    public Iterator<BasicDBObject> groupWithQueryCondition(){
        Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(Criteria.where("age").gte(10)),
                Aggregation.group("school", "grade").count().as("总人数"),
                Aggregation.project("总人数").and("分组字段").previousOperation()//显示分组字段,不显示_id
        );
        AggregationResults<BasicDBObject> res = mongoTemplate.aggregate(agg, "stu", BasicDBObject.class);
        Iterator<BasicDBObject> iterator = res.iterator();
        return iterator;
    }

测试

  • 根据年级统计 GET http://localhost:8080/template/group/grade

  • 根据学校统计 GET http://localhost:8080/template/group/school

  • 多条件多字段统计 GET http://localhost:8080/template/group

MongoRepository使用

定义一个接口,继承MongoRepository,而后能够使用基于JPA的mongo操做了

public interface UserRepository extends MongoRepository<User, String> {

    User findByName(String name);
}

使用

/**------------ MongoRepository -------------*/
    @Autowired private UserRepository userRepository;
	
    @PostMapping("/repository/user")
    public User save1(@RequestBody User user){
        return userRepository.save(user);
    }

    @GetMapping("/repository/user")
    public List<User> findAll1(){
        return userRepository.findAll();
    }

    @GetMapping("/repository/user/{name}")
    public User findOne1(@PathVariable String name){
        return userRepository.findByName(name);//自定义方法
    }

项目源码

https://gitee.com/yimingkeji/springboot/tree/master/mongo

相关文章
相关标签/搜索