1、mongo是什么:
ongoDB是一种强大、灵活、追求性能、易扩展的数据库;是面向文档的数据库,不是关系型数据库,是NoSQL(not only SQL)的一种。
MongoDB的面向文档,就是将关系型数据库中的“行”的概念换成了更加灵活的”文档”,以文档为存储单位。
文档的值可以是数组、文档等复杂的数据模型,这使得MongoDB可以支持复杂的结构类型;
另外MongoDB也不需要预先定义文档的键值,这使得开发者增加或者删除属性变得异常方便。
2、MongoDB功能特点
索引
MangoDB支持通用辅助索引、复合索引、地理空间索引和全文索引,能进行多种快速查询。
聚合
MangoDB支持MapReduce、aggregation pipeline等聚合
特殊集合
MongoDB提供TTL集合(超时集合)和固定大小的集合(适用于日志)
文件存储
MangeDB支持简单的文件存储。
不具备的功能
事务
3、能解决的问题:
数据量较大的情况下,关系型数据库的查询效率以及索引优化方案较为困难,可以引入mongo来实现查询效率问题
4、怎么用(落地实现)
mongo创建索引:db.test.test_db_cl.ensureIndex({“name”:1})
格式为db.库名.表明.ensureIndex(“字段”:1)
创建的复合索引格式如下:
db.库名.表明.ensureIndex(“字段1”:1,”字段2”:1)
除了让mongodb默认索引的名字外,我们还可以去一个方便记的名字,方法就是为ensureIndex指定name的值,如:
db.user.ensureIndex({“name”:1},{“name”:”IX_name”})
如果索引没有用了,可以使用dropIndexes将其删掉:
db.runCommand({“dropIndexes”:”user”,”index”:”IX_name”})
java实现步骤(约定>配置>编码)
(1)、约定引入pom
(2)、配置
spring:
data:
mongodb:
uri: mongodb://服务器IP:端口/数据库名称
# 上方未明确指定某个数据库的用户进行连接
spring:
data:
mongodb:
uri: mongodb://用户名:密码@服务器IP:端口/数据库名称
# 上方为明确指定某个数据库的用户进行连接
# 也可以使用admin 数据库中的用户进行连接统一到admin 数据库进行认证
# admin 用户认证 url写法:mongodb://账户:密码%40@IP:端口/数据库名?authSource=admin&authMechanism=SCRAM-SHA-1
mongodb数据库与mysql不一样 mysql 一个普通用户可以管理多个数据库,但是mongo每一个库都有一个独立的管理用户,连接时需要输入对应用户密码
MongoDB监听配置
此类若不加,那么插入的一行会默认添加一个_class字段来存储实体类类型 如(com.example.demo.entity.Student)
@Configuration
public class ApplicationReadyListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
MongoTemplate oneMongoTemplate;
private static final String TYPEKEY = "_class";
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
MongoConverter converter = oneMongoTemplate.getConverter();
if (converter.getTypeMapper().isTypeKey(TYPEKEY)) {
((MappingMongoConverter) converter).setTypeMapper(new DefaultMongoTypeMapper(null));
}
}
}
pojo实体类,service,controller编写
@Data
@Document(collection = "student") //指定要对应的文档名(表名)
public class Student {
/*** 自定义mongo主键 加此注解可自定义主键类型以及自定义自增规则
* 若不加 插入数据数会默认生成 ObjectId 类型的_id 字段
* org.springframework.data.annotation.Id 包下
* mongo库主键字段还是为_id 。不必细究(本文实体类中为id)
*/
@Id
private Long id;
private String username;
private LocalDateTime timer;
}
MongoTemplate 操作mongo库
(一)新增
声明接口
int insertStudent(Student student);
实现类
@Override
public int insertStudent(Student student) {
try {
student.setTimer(LocalDateTime.now());
mongoTemplate.insert(student);
return 1;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
(二)修改
此处根据Id修改 ,如需其他条件 修改Query 查询条件即可
声明接口
int updateStudent(Student student);
实现类
需注意 Query 以及update 在org.springframework.data.mongodb.core.query 包下
@Override
public int updateStudent(Student student) {
//通过query根据id查询出对应对象,通过update对象进行修改
Query query = new Query(Criteria.where("_id").is(student.getId()));
Update update = new Update().set("username", student.getUsername());
try {
mongoTemplate.updateFirst(query, update, Student.class);
return 1;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
(三)删除
此处根据id删除,如需其他删除条件,修改对应Query对象即可
声明接口
int removeStudent(Long id);
实现类
@Override
public int removeStudent(Long id) {
Query query=new Query(Criteria.where("_id").is(id));
try {
mongoTemplate.remove(query,Student.class);
return 1;
} catch (Exception e) {
e.printStackTrace();
return -1;
}
}
(四)、查询
声明接口
Student findOne(Student student);
实现类
@Override
public Student findOne(Student student) {
Query query = new Query(Criteria.where("_id").is(student.getId()));
Student one = mongoTemplate.findOne(query, Student.class);
return one;
}
查询集合
@GetMapping("/testA")
public List<MongoTestDTO> testA(){
Criteria criteria1 = Criteria.where("id").is(1L);
Criteria criteria2 = Criteria.where("age").is(11);
Criteria criteria3 = Criteria.where("name").is("张三");
List<Criteria> list = new ArrayList<>();
list.add(criteria1);
list.add(criteria2);
list.add(criteria3);
Criteria criteria = new Criteria().andOperator(list);
Query query = new Query(criteria);
query.with(Sort.by(Sort.Order.asc("name")));
query.skip((1-1)*10).limit(10);
return mongoTemplate.find(query, MongoTestDTO.class);
}