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); }