一、mongodb简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
二、mongodb与mysql比较
1、mysql:
优点:
在不同的引擎上有不同 的存储方式。
查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高。
开源数据库的份额在不断增加,mysql的份额页在持续增长。
缺点:
在海量数据处理的时候效率会显著变慢。
2、mongodb:
优点:
快速。在适量级的内存的Mongodb的性能是非常迅速的,它将热数据存储在物理内存中,使得热数据的读写变得十分快。
高扩展性。mongodb的高可用与集群架构拥有十分高的扩展性,通过物理机器的增加,以及sharding的增加,mongodb的扩展将达到一个十分惊人的地步。
自身的failover机制。Mongodb的副本集配置中,当主库遇到问题,无法继续提供服务的时候,副本集将选举出一个新的主库继续提供服务
json的存储格式。mongodb的json与bson格式很适合文档格式的存储与查询。
缺点:
不支持事务
三、应用场景
1、将mongodb作为后端db来代替mysql使用,与mongodb 属于平行级别。
2、将mongodb作为类似redis ,memcache来做缓存db,为mysql提供服务。
四、mongodb基础命令
1、database
查看当前的数据库:
db
查看所有的数据库:
show dbs /show databases
切换数据库:
use db_name
删除当前的数据库:
db.dropDatabase()
2、collection
创建集合:db.createCollection(name, options)
显示集合:show collections
删除集合:db.集合名称.drop()
3、文档操作
插入文档:
db.集合名称.insert(document)
保存文档:
db.集合名称.save(document)修改文档:db.集合名称.update(<query> ,<update>,{multi: <boolean>})
删除文档:db.集合名称.remove(<query>,{justOne: <boolean>})
查询文档1:db.集合名称.find({条件⽂档})
查询文档2:db.集合名称.findOne({条件⽂档})
查询文档3:db.集合名称.find({条件⽂档}).pretty()
分页查询文档:db.stu.find().skip(5).limit(4)
排序查询文档:db.stu.find().sort({gender:-1,age:1})
查询统计:db.stu.find({gender:true}).count()
条件查询:db.collection.find({ field: { $gt: value } })
范围查询:db.collection.find({ field: { $gte: value1, $lte: value2 } })
逻辑查询: db.collection.find({ $or: [{ field1: value1 }, { field2: value2 }] })
聚合查询:db.collection.aggregate([{ group: { _id: "field", count: { $sum: 1 } } }])批量插入文档:db.collection.insertMany([{ field1: value1 }, { field2: value2 }])
批量更新文档:db.collection.updateMany({ field: value }, { $set: { fieldToUpdate: newValue } })
批量删除文档:db.collection.deleteMany({ field: value })
4、mongodb系统操作
备份数据库:mongodump --db database --out 备份目录
恢复数据库:mongorestore --db database 恢复文档
显示数据库状态:db.stats()
显示集合状态:db.collection.stats()
三、mongodb与java连接
1、引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies>
2、数据库配置
spring: data: mongodb: uri: mongodb://localhost:27017/mongodb
3、常用方法
全部查询:mongoTemplate.findAll(User.class)
id查询:mongoTemplate.findById(<id>, User.class)
条件查询:mongoTemplate.find(query, User.class)
修改:mongoTemplate.upsert(query, update, User.class)
删除:mongoTemplate.remove(query, User.class)
创建:mongoTemplate.insert(User)精准条件:criteria.and(“key”).is(“条件”)
模糊条件:criteria.and(“key”).regex(“条件”)
封装条件:query.addCriteria(criteria)
大于:Criteria gt = Criteria.where(“key”).gt(“条件”)
小于:Criteria lt = Criteria.where(“key”).lt(“条件”)
Query.addCriteria(new Criteria().andOperator(gt,lt))
排序 :query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))
4、代码(实体类)
package com.example.test.mongodb.mode;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Document("mycol2")
public class Mycol2 {
private String name;
}
5、代码(测试类)
package com.example.test.mongodb.controller;
import com.example.test.mongodb.mode.Mycol2;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
@RestController
@RequestMapping("/testMongodb")
public class TestMongodbController {
@Autowired
private MongoTemplate mongoTemplate;
//添加文档
@GetMapping("insert")
public Mycol2 insert() {
Mycol2 Mycol2 = new Mycol2();
Mycol2.setName("test");
// return mongoTemplate.save(Mycol2);
return mongoTemplate.insert(Mycol2);
}
//查询所有
@GetMapping("findAll")
public List<Mycol2> findAll() {
return mongoTemplate.findAll(Mycol2.class);
}
//根据id查询
@GetMapping("findId")
public Mycol2 getById(@RequestParam String id) {
return mongoTemplate.findById(id, Mycol2.class);
}
//条件查询
@GetMapping("findMycol2")
public List<Mycol2> findMycol2List() {
Query query = new Query(Criteria
.where("name").is("test")
.and("age").is(20));
return mongoTemplate.find(query, Mycol2.class);
}
//模糊查询
@GetMapping("findLike")
public void findMycol2sLikeName() {
String name = "est";
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Query query = new Query(Criteria.where("name").regex(pattern));
List<Mycol2> Mycol2List = mongoTemplate.find(query, Mycol2.class);
System.out.println(Mycol2List);
}
//分页查询
@GetMapping("findPage")
public Map<String, Object> findPage() {
Query query = new Query();
String regex = String.format("%s%s%s", "^.*", "wen", ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
query.addCriteria(Criteria.where("name").regex(pattern));
int totalCount = (int) mongoTemplate.count(query, Mycol2.class);
List<Mycol2> Mycol2List = mongoTemplate.find(query.skip(0).limit(10), Mycol2.class);
Map<String, Object> pageMap = new HashMap<>();
pageMap.put("list", Mycol2List);
pageMap.put("totalCount",totalCount);
return pageMap;
}
}