MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热
门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最
像关系数据库的产品。它支持的数据结构很是松散,是相似 JSON 的 BSON 格式,所以能够
存储比较复杂的数据类型。html
对于数据量较大且价值较低的数据,可使用mongodb减轻mysql的压力vue
MongoDB 的官方网站地址是:http://www.mongodb.org/java
MongoDB 的逻辑结构是一种层次结构。主要由:
文档(document)
、集合(collection)
、数据库(database)
这三部分组成的。逻辑结构是面
向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
(1)MongoDB 的文档(document),至关于关系数据库中的一行记录。
(2)多个文档组成一个集合(collection),至关于关系数据库的表。
(3)多个集合(collection),逻辑上组织在一块儿,就是数据库(database)。
(4)一个 MongoDB 实例支持多个数据库(database)。
文档(document)、集合(collection)、数据库(database)的层次结构以下图:mysql
下表是MongoDB与MySQL数据库逻辑结构概念的对比:linux
MongoDb 关系型 | 数据库Mysql |
---|---|
数据库(databases) | 数据库(databases) |
集合(collections) | 表(table) |
文档(document) | 行(row) |
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(){/…/}}spring
mongod --dbpath c:\data\db
ps:为了启动方便也能够写一个startup.bat文件将上面的命令写入。sql
http://www.javashuo.com/article/p-yfrsgskc-nb.htmlmongodb
语法格式:docker
use 数据库名称
ps:若是数据库不存在则自动建立
如下为建立sys数据库
use sys
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)
语法:db.集合.update(json条件,要更新的json)
注意:要使用修改器$set
来实现,不然修改后其它字段都不见了
db.sysuser.update({_id:"1"},{$set:{name:"张三三"}})
语法:db.集合.remove(json条件)
注意:条件不传则为所有删除(慎用!)
db.sysuser.remove({_id:"1"});
语法:db.集合.count(json条件)
注意:条件不传则统计集合全部数据
db.sysuser.count(); db.sysuser.count({_id:"1"});
MongoDB的模糊查询是经过正则表达式的方式实现的。格式为:
/模糊查询字符串/
模糊查询姓名中带张
的
db.sysuser.find({name:/张/});
查询姓名中以张
开头的
db.sysuser.find({name:/^张/});
<, <=, >, >= 这个操做符也是很经常使用的,格式以下:
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}})
$in
例如:查询_id包含1和2的
db.sysuser.find({_id:{$in:["1","2"]}});
$nin
db.sysuser.find({_id:{$nin:["1","2"]}});
若是须要查询同时知足两个以上条件,须要使用$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"}}]})
若是想实现对某列值在原有值的基础上进行增长或减小,可使用$inc
运算符来实现
例如:让_id等于5的age增长1
db.sysuser.update({_id:"5"},{$inc:{age:NumberInt(1)}});
mongodb-driver
是mongo官方推出的java链接mongoDB的驱动包,至关于JDBC驱动。
经过一个入门的案例来了解mongodb-driver的基本使用
<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(); } }
//插入 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(); }
//经过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); } }
//查询年龄大于等于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); } }
SpringData家族成员之一,用于操做MongoDb的持久层框架,封装了底层的mongodb-driver
API相似SpringDataJPA
官网主页: https://projects.spring.io/spring-data-mongodb/
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
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
@Document(collection = "sysuser")//配置对应的mongo集合 public class SysUser implements Serializable{ @Id private String _id; private String name; private Integer age; // getter and setter ..... }
public interface SysUserDao extends MongoRepository<SysUser,String> { }
@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); } }
@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); } }
与SpringDataJPA相似
//查询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); }
public Page<SysUser> findByNameLike(Integer page, Integer size) { PageRequest pageRequest = PageRequest.of(page - 1, size); return sysUserDao.findByNameLike("王",pageRequest); }
public interface SysUserDao extends MongoRepository<SysUser,String> { Page<SysUser> findByNameLike(String name, Pageable pageable); }
首先须要注入MongoTemplate
public class SysUserService { @Autowired private MongoTemplate mongoTemplate;//注入操做mongo的模板对象 //....... }
而后就能够经过MongoTemplate的API来操做Mongo了
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); }
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); }