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
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(); } }
<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能够灵活的操做mongodb,如基本的CRUD、统计、聚合等mongodb
实体类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/user
springboot
查看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" }
新建一个实体
@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
,而后能够使用基于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);//自定义方法 }