1、MongoDB简介
1.1、什么是MongoDB
MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热
门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最
像关系数据库的产品。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以
存储比较复杂的数据类型。
对于数据量较大且价值较低的数据,可以使用mongodb减轻mysql的压力
MongoDB 的官方网站地址是:http://www.mongodb.org/
1.2、MongoDB体系结构
MongoDB 的逻辑结构是一种层次结构。主要由:文档(document)
、集合(collection)
、数据库(database)
这三部分组成的。逻辑结构是面
向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
(1)MongoDB 的文档(document),相当于关系数据库中的一行记录。
(2)多个文档组成一个集合(collection),相当于关系数据库的表。
(3)多个集合(collection),逻辑上组织在一起,就是数据库(database)。
(4)一个 MongoDB 实例支持多个数据库(database)。
文档(document)、集合(collection)、数据库(database)的层次结构如下图:
下表是MongoDB与MySQL数据库逻辑结构概念的对比:
MongoDb 关系型 | 数据库Mysql |
---|---|
数据库(databases) | 数据库(databases) |
集合(collections) | 表(table) |
文档(document) | 行(row) |
1.3、数据类型
null:用于表示空值或者不存在的字段,{“x”:null}
布尔型:布尔类型有两个值true和false,{“x”:true}
数值:shell默认使用64位浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使用
NumberInt(4字节符号整数)或NumberLong(8字节符号整数),
{“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
字符串:UTF-8字符串都可以表示为字符串类型的数据,{“x”:“呵呵”}
日期:日期被存储为自新纪元依赖经过的毫秒数,不存储时区,{“x”:new Date()}
正则表达式:查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相
同,{“x”:/[abc]/}
数组:数据列表或数据集可以表示为数组,{“x”: [“a“,“b”,”c”]}
内嵌文档:文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”:{“y”:3 }}
对象Id:对象id是一个12字节的字符串,是文档的唯一标识,{“x”: objectId() }
二进制数据:二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要
将非utf-字符保存到数据库中,二进制数据是唯一的方式。
代码:查询和文档中可以包括任何JavaScript代码,{“x”:function(){/…/}}
2.MongoDB 安装
2.1 、windows安装
- 双击mongodb-win32-x86_64-2008plusssl-3.2.10-signed.msi 一直点下一步
- 安装完后建立MongoDB存数据的文件夹:C:\data\db
- 在MongoDB的安装目录下的bin目录下打开cmd窗口,输入一下命令启动窗口
mongod --dbpath c:\data\db
ps:为了启动方便也可以写一个startup.bat文件将上面的命令写入。
2.2、linux安装
2.3、docker安装
https://www.cnblogs.com/helf/p/13188265.html
3、常用命令
3.1、选择和创建数据库
语法格式:
use 数据库名称
ps:如果数据库不存在则自动创建
以下为创建sys数据库
use sys
3.2、插入与查询文档
插入文档
db.sysuser.insert({_id:"1",name:"张三",age:NumberInt(18)});
插入文档的语法格式:
db.集合名称.insert(json数据);
例如:
db.sysuser.insert({_id:"1",name:"张三",age:NumberInt(18)});
每条文档会有一个叫_id
的字段,这个相当于关系数据库中表的主键,当插入文档记录时没有指定该字段MongoDB会自动创建,其类型是ObjectID
类型。如果在插入文档记录时指定该字段也可以,其类型可以是ObjectID类型,也可以是MongoDB支持的任意类型。
查询文档
先插入一些数据
db.sysuser.insert({_id:"2",name:"李四",age:NumberInt(21)});
db.sysuser.insert({_id:"3",name:"王五",age:NumberInt(28)});
db.sysuser.insert({_id:"4",name:"赵柳",age:NumberInt(22)});
db.sysuser.insert({_id:"5",name:"田七",age:NumberInt(23)});
- 查询集合的所有数据
语法:db.集合.find()
db.sysuser.find()
- 根据字段查询文档
语法:db.集合.find(json)
db.sysuser.find({_id:"1"})
- 查询符合条件的第一条记录
语法:db.集合.findOne(json);
- 返回指定条数的记录
语法:db.集合.find().limit(条数)
db.sysuser.find().limit(2)
3.3、修改和删除文档
修改文档
语法:db.集合.update(json条件,要更新的json)
注意:要使用修改器$set
来实现,否则修改后其它字段都不见了
db.sysuser.update({_id:"1"},{$set:{name:"张三三"}})
删除文档
语法:db.集合.remove(json条件)
注意:条件不传则为全部删除(慎用!)
db.sysuser.remove({_id:"1"});
3.4、统计条数
语法:db.集合.count(json条件)
注意:条件不传则统计集合所有数据
db.sysuser.count();
db.sysuser.count({_id:"1"});
3.5、模糊查询
MongoDB的模糊查询是通过正则表达式的方式实现的。格式为:
/模糊查询字符串/
模糊查询姓名中带张
的
db.sysuser.find({name:/张/});
查询姓名中以张
开头的
db.sysuser.find({name:/^张/});
3.6、大于 小于 不等于
<, <=, >, >= 这个操作符也是很常用的,格式如下:
db.集合名称.find({ "field" : { $gt: value }}) // 大于: field > value
db.集合名称.find({ "field" : { $lt: value }}) // 小于: field < value
db.集合名称.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.集合名称.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.集合名称.find({ "field" : { $ne: value }}) // 不等于: field != value
查询年龄大于22岁的
db.sysuser.find({"age":{$gt:18}})
3.7、包含与不包含
- 包含
$in
例如:查询_id包含1和2的
db.sysuser.find({_id:{$in:["1","2"]}});
- 不包含
$nin
db.sysuser.find({_id:{$nin:["1","2"]}});
3.8、条件连接
如果需要查询同时满足两个以上条件,需要使用$and
操作符将条件进行关联。(相当于SQL的and)
格式为:
$and:[ { },{ },{ } ]
例如:查询_id大于等于2小于等于5的数据
db.sysuser.find({$and:[{_id:{$gte:"2"}},{_id:{$lte:"5"}}]})
如果两个以上条件之间是或者的关系,使用$or
操作符进行关联,与前面and的使用方式相同
格式为:
$or:[ { },{ },{ } ]
例如:查询_id不等于2或者大于等于4的
db.sysuser.find({$or:[{_id:{$ne:"2"}},{_id:{$gte:"4"}}]})
3.9、列值增长
如果想实现对某列值在原有值的基础上进行增加或减少,可以使用$inc
运算符来实现
例如:让_id等于5的age增加1
db.sysuser.update({_id:"5"},{$inc:{age:NumberInt(1)}});
4、java操作mongodb
mongodb-driver
是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动。
通过一个入门的案例来了解mongodb-driver的基本使用
4.1、mongodb-driver
4.1.1、查询全部
- 创建工程
- 引入依赖
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.6.3</version>
</dependency>
</dependencies>
- 创建测试类
public class MongoDemo {
public static void main(String[] args) {
findAll();
}
//查询所有
public static void findAll(){
//创建连接对象
MongoClient mongoClient = new MongoClient("127.0.0.1");
//通过连接对象连接数据库
MongoDatabase db = mongoClient.getDatabase("sys");
//通过数据库获取集合
MongoCollection<Document> sysuser = db.getCollection("sysuser");
//通过集合获取文档
FindIterable<Document> documents = sysuser.find();
//遍历文档
for (Document document : documents) {
String id = document.getString("_id");
String name = document.getString("name");
Integer age = document.getInteger("age");
System.out.println("id="+id+",name="+name+",age="+age);
}
//关闭连接
mongoClient.close();
}
}
4.1.2、插入数据
//插入
public static void insert(){
//创建连接对象
MongoClient mongoClient = new MongoClient("127.0.0.1");
//通过连接对象连接数据库
MongoDatabase db = mongoClient.getDatabase("sys");
//通过数据库获取集合
MongoCollection<Document> sysuser = db.getCollection("sysuser");
//插入数据
Map map = new HashMap();
map.put("_id","6");
map.put("age",18);
map.put("name","王八");
Document document = new Document(map);
sysuser.insertOne(document);
//关闭连接
mongoClient.close();
}
4.1.3、条件查询
- 查询id为1的记录
//通过id查询
public static void findById(){
//创建连接对象
MongoClient mongoClient = new MongoClient("127.0.0.1");
//通过连接对象连接数据库
MongoDatabase db = mongoClient.getDatabase("sys");
//通过数据库获取集合
MongoCollection<Document> sysuser = db.getCollection("sysuser");
BasicDBObject bson = BasicDBObject.parse("{_id:'1'}");//构造查询json条件
FindIterable<Document> documents = sysuser.find(bson);
//遍历文档
for (Document document : documents) {
String id = document.getString("_id");
String name = document.getString("name");
Integer age = document.getInteger("age");
System.out.println("id="+id+",name="+name+",age="+age);
}
}
- 查询age大于等于22的记录
//查询年龄大于等于22的记录
public static void findAge(){
//创建连接对象
MongoClient mongoClient = new MongoClient("127.0.0.1");
//通过连接对象连接数据库
MongoDatabase db = mongoClient.getDatabase("sys");
//通过数据库获取集合
MongoCollection<Document> sysuser = db.getCollection("sysuser");
BasicDBObject bson = BasicDBObject.parse("{age:{$gte:22}}");//构造查询条件
FindIterable<Document> documents = sysuser.find(bson);
//遍历文档
for (Document document : documents) {
String id = document.getString("_id");
String name = document.getString("name");
Integer age = document.getInteger("age");
System.out.println("id="+id+",name="+name+",age="+age);
}
}
4.2、SpringDataMongoDB
SpringData家族成员之一,用于操作MongoDb的持久层框架,封装了底层的mongodb-driver
API类似SpringDataJPA
官网主页: https://projects.spring.io/spring-data-mongodb/
4.2.1、创建工程
- 创建springboot工程
- 在pom.xml中引入mongo的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
- application.yml
server:
port: 8080
spring:
application:
name: springdatamongo #指定服务名
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/vue?characterEncoding=utf-8
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
jackson:
date-format: yyyy-MM-dd HH:mm:ss #配置日期响应时的格式
time-zone: GMT+8
data:
mongodb: #配置mongodb
host: 127.0.0.1
database: sysuser
4.2.2、基本增删改查API的实现
- 创建实体类
@Document(collection = "sysuser")//配置对应的mongo集合
public class SysUser implements Serializable{
@Id
private String _id;
private String name;
private Integer age;
// getter and setter .....
}
- 创建dao
public interface SysUserDao extends MongoRepository<SysUser,String> {
}
- 创建service
@Service
@Transactional
public class SysUserService {
@Autowired
private SysUserDao sysUserDao;
@Autowired
private IdWorker idWorker;
//查询所有
public List<SysUser> findAll() {
List<SysUser> list = sysUserDao.findAll();
System.out.println("=========="+list);
return list;
}
//添加
public void add() {
SysUser sysUser = new SysUser();
sysUser.set_id(idWorker.nextString());
sysUser.setAge(18);
sysUser.setName("贺刘芳");
sysUserDao.save(sysUser);
}
//根据id查询
public SysUser findById() {
return sysUserDao.findById("1").get();
}
//删除
public void remove() {
sysUserDao.deleteById("1277818770521460736");
}
//修改
public void modify() {
SysUser sysUser = new SysUser();
sysUser.set_id("1");
sysUser.setAge(58);
sysUser.setName("扎三");
sysUserDao.save(sysUser);
}
//分页查询所有
public Page<SysUser> findAll(Integer page, Integer size) {
PageRequest pageRequest = PageRequest.of(page - 1, size);
return sysUserDao.findAll(pageRequest);
}
}
- 创建controller
@RestController
@RequestMapping("/sysuser")
public class SysUserController {
@Autowired
private SysUserService sysUserService;
//查询全部
@RequestMapping("findAll")
public Result findAll(){
List<SysUser> sysUserList = sysUserService.findAll();
return new Result(true, StatusCode.OK,"ok",sysUserList);
}
//根据id查询
@RequestMapping("findById")
public Result findById(){
SysUser sysUser = sysUserService.findById();
return new Result(true, StatusCode.OK,"ok",sysUser);
}
//增加
@RequestMapping("add")
public Result add(){
sysUserService.add();
return new Result(true, StatusCode.OK,"ok");
}
//修改
@RequestMapping("modify")
public Result modify(){
sysUserService.modify();
return new Result(true, StatusCode.OK,"ok");
}
//删除
@RequestMapping("remove")
public Result remove(){
sysUserService.remove();
return new Result(true, StatusCode.OK,"ok");
}
//分页查询所有
@RequestMapping("findAllByPage")
public Result findAllByPage(Integer page,Integer size){
Page<SysUser> pageresult = sysUserService.findAll(page,size);
return new Result(true, StatusCode.OK,"ok",pageresult);
}
}
4.2.3、根据方法命名查询
与SpringDataJPA类似
- controller
//查询name中带有王的
@RequestMapping("findByNameLike")
public Result findByNameLike(Integer page,Integer size){
Page<SysUser> pageresult = sysUserService.findByNameLike(page,size);
return new Result(true, StatusCode.OK,"ok",pageresult);
}
- service
public Page<SysUser> findByNameLike(Integer page, Integer size) {
PageRequest pageRequest = PageRequest.of(page - 1, size);
return sysUserDao.findByNameLike("王",pageRequest);
}
- dao
public interface SysUserDao extends MongoRepository<SysUser,String> {
Page<SysUser> findByNameLike(String name, Pageable pageable);
}
4.2.4、使用MongoTemplate
首先需要注入MongoTemplate
public class SysUserService {
@Autowired
private MongoTemplate mongoTemplate;//注入操作mongo的模板对象
//.......
}
然后就可以通过MongoTemplate的API来操作Mongo了
- id为1的age的值增加1
public void updateAge(){
Query query = new Query();
query.addCriteria(Criteria.where("_id").is("1"));
Update update = new Update();
update.inc("age",1);//让age的值自增1
mongoTemplate.updateFirst(query,update,SysUser.class);
}
- 修改id为1的age和name字段
public void update(){
Query query = new Query();
query.addCriteria(Criteria.where("_id").is("1"));
Update update = new Update();
//修改字段
update.set("age",1);
update.set("name","张撒");
mongoTemplate.updateFirst(query,update,SysUser.class);
}
相关文档
https://www.runoob.com/mongodb/mongodb-tutorial.html
https://blog.csdn.net/sinat_35821285/article/details/83511203