MongoDB的简单使用
1.MongoDB简介
MongoDB 是一个基于分布式文件存储的 NoSQL 数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。关于什么是 NoSQL 可阅读《学了那么多 NoSQL 数据库 NoSQL究竟是啥》
MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系数据库的。
2.MongoDB和关系型数据库的对比
关系型数据库 |
mongodb |
database(数据库) |
database(数据库) |
table(表) | collection(集合) |
row(行) |
document or BSON document(文档) |
column(列) |
field(字段) |
index(索引) | index(索引) |
table joins(表连接) |
embedded documents and linking(嵌入的文档和链接) |
primary key Specify any uniquecolumn or column combination asprimary key.(指定任意唯一的列或列组合作为主键) |
primary keyIn MongoDB, the primary keyisautomatically set to the _id field.(在 MongoDB中,主键被自动设置为 _id 字段) |
3.MongoDB 数据类型
数据类型 |
描述 |
Object ID |
Documents 自生成的 _id |
String |
字符串,必须是utf-8 |
Boolean | 布尔值,true 或者false |
Integer |
Integer:整数 (Int32 Int64 一般我们用Int32) |
Double |
浮点数 (没有float类型,所有小数都是Double) |
Arrays | 数组或者列表,多个值存储到一个键 |
Object |
Object |
Null |
空数据类型 , 一个特殊的概念,None Null |
Timestamp |
时间戳 |
Date |
存储当前日期或时间 unix时间格式 |
4.安装MongoDB
官网下载地址:https://www.mongodb.com/try/download/community
我这里下载的是Linux最新版的。
解压一下
# 解压 mongodb 至指定目录tar -zxvf /root/mongodb/mongodb-linux-x86_64-rhel80-5.0.5.tgz -C /usr/local/ # 重命名解压目录为 mongodbmv /usr/local/mongodb-linux-x86_64-rhel80-5.0.5/ /usr/local/mongodb
创建数据和日志存放目录
# 创建储存数据的目录mkdir-p /usr/local/mongodb/data/db # 创建储存日志的目录mkdir-p /usr/local/mongodb/logs # 创建日志文件touch /usr/local/mongodb/logs/mongodb.log
bin目录下增加配置文件
# 数据文件储存目录dbpath = /usr/local/mongodb/data/db # 日志文件储存目录logpath = /usr/local/mongodb/logs/mongodb.log # 以追加的方式记录日志logappend =true# 端口默认为 27017port =27017# 对访问 IP 地址不做限制,默认为本机地址bind_ip =0.0.0.0 # 以守护进程的方式启用,即在后台运行fork =true
mongodb目录下启动目录下通过配置文件启动
#启动bin/mongod -f bin/mongodb.conf #关闭bin/mongod -f bin/mongodb.conf --shutdown
这样就启动完成了
远程连接的时候记得开放端口 不然链接不上
5.java代码操作MongoDB
引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
配置mongodb
spring data mongodb database db1 host106.14.226.10 port27017#因为没有设置校验所以不用填写账号和密码 自己使用的时候记得出创建账号添加校验#大家也可以直接连我这个测试(开放一个月)
创建一个测试对象
"student")//这里填collection的名称 (publicclassStudent { privateStringid; privateStringname; privateIntegerage; }
编写测试类
classes= {MogodbApplication.class}) (publicclassmongoDBTest { privateMongoTemplatemongoTemplate; publicvoidtest(){ } }
1.新增
Studentstudent=newStudent(); student.setName("张三"); student.setAge(24); mongoTemplate.insert(student);
mongoTemplet添加的会有一个_class字段 如果不想有这个字段可以写一个config
publicclassMongoConfigimplementsApplicationListener<ContextRefreshedEvent> { MongoTemplatemongoTemplate; publicvoidonApplicationEvent(ContextRefreshedEventcontextRefreshedEvent) { MongoConverterconverter=mongoTemplate.getConverter(); if (converter.getTypeMapper().isTypeKey("_class")) { ((MappingMongoConverter) converter).setTypeMapper(newDefaultMongoTypeMapper(null)); } } }
2.查询
排序
Queryquery=newQuery(); query.with(Sort.by("age").descending()); List<Student>students=mongoTemplate.find(query, Student.class);
精确查询
Queryquery=newQuery(); query.addCriteria(Criteria.where("name").is(name)); List<Student>students=mongoTemplate.find(query, Student.class);
模糊查询
Patternpattern=Pattern.compile("^.*"+name+".*$", Pattern.CASE_INSENSITIVE); Queryquery=newQuery(); query.addCriteria(Criteria.where("name").regex(pattern)); List<Student>students=mongoTemplate.find(query, Student.class);
范围查询
//gte : >= ; lte <= ; gt : > ; lt : <
Queryquery=newQuery(); query.addCriteria(Criteria.where("age").gte(20).lte(23)); List<Student>students=mongoTemplate.find(query, Student.class);
分页查询
Queryquery=newQuery(); query.addCriteria(Criteria.where("age").gte(20).lte(23)); longtotal=mongoTemplate.count(query, Student.class); query.limit(pageSize).skip(PageSize*(pageNum-1)) List<Student>students=mongoTemplate.find(query, Student.class);
多条件查询
Queryquery=newQuery(); query.addCriteria(Criteria.where("name").is("张三").and("age").is(23)); List<Student>students=mongoTemplate.find(query, Student.class);
单条查询
Studentstudent=mongoTemplate.findOne(query, Student.class);
3.更新
Queryquery=newQuery(); //把名字是张三的改成李四query.addCriteria(Criteria.where("name").is("张三")); Updateupdate=newUpdate(); update.set("name", "李四"); mongoTemplate.updateFirst(query, update, Student.class);
4.删除
Queryquery=newQuery();、//删除名字是张三的数据query.addCriteria(Criteria.where("name").is("张三")); longdeletedCount=mongoTemplate.remove(query, Student.class).getDeletedCount();