MongoDB筆記整理

一、MongoDB簡介

1.一、什麼是MongoDB

MongoDB 是一個跨平臺的,面向文檔的數據庫,是當前 NoSQL 數據庫產品中最熱
門的一種。它介於關係數據庫和非關係數據庫之間,是非關係數據庫當中功能最豐富,最
像關係數據庫的產品。它支持的數據結構很是鬆散,是相似 JSON 的 BSON 格式,所以能夠
存儲比較複雜的數據類型。html

對於數據量較大且價值較低的數據,可使用mongodb減輕mysql的壓力vue

MongoDB 的官方網站地址是:http://www.mongodb.org/java

1.二、MongoDB體系結構

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)

1.三、數據類型

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

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文件將上面的命令寫入。sql

2.二、linux安裝

2.三、docker安裝

http://www.javashuo.com/article/p-yfrsgskc-nb.htmlmongodb

三、經常使用命令

3.一、選擇和建立數據庫

語法格式:docker

use 數據庫名稱

ps:若是數據庫不存在則自動建立

如下爲建立sys數據庫

use sys

3.二、插入與查詢文檔

插入文檔

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.三、修改和刪除文檔

修改文檔

語法:db.集合.update(json條件,要更新的json)

注意:要使用修改器$set來實現,不然修改後其它字段都不見了

db.sysuser.update({_id:"1"},{$set:{name:"張三三"}})

刪除文檔

語法:db.集合.remove(json條件)

注意:條件不傳則爲所有刪除(慎用!)

db.sysuser.remove({_id:"1"});

3.四、統計條數

語法:db.集合.count(json條件)

注意:條件不傳則統計集合全部數據

db.sysuser.count();
db.sysuser.count({_id:"1"});

3.五、模糊查詢

MongoDB的模糊查詢是經過正則表達式的方式實現的。格式爲:

/模糊查詢字符串/

模糊查詢姓名中帶

db.sysuser.find({name:/張/});

查詢姓名中以開頭的

db.sysuser.find({name:/^張/});

3.六、大於 小於 不等於

<, <=, >, >= 這個操做符也是很經常使用的,格式以下:

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.七、包含與不包含

  • 包含 $in

例如:查詢_id包含1和2的

db.sysuser.find({_id:{$in:["1","2"]}});
  • 不包含 $nin
db.sysuser.find({_id:{$nin:["1","2"]}});

3.八、條件鏈接

若是須要查詢同時知足兩個以上條件,須要使用$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.九、列值增加

若是想實現對某列值在原有值的基礎上進行增長或減小,可使用$inc運算符來實現

例如:讓_id等於5的age增長1

db.sysuser.update({_id:"5"},{$inc:{age:NumberInt(1)}});

四、java操做mongodb

mongodb-driver是mongo官方推出的java鏈接mongoDB的驅動包,至關於JDBC驅動。
經過一個入門的案例來了解mongodb-driver的基本使用

4.一、mongodb-driver

4.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.二、插入數據

//插入
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.三、條件查詢

  • 查詢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.二、SpringDataMongoDB

SpringData家族成員之一,用於操做MongoDb的持久層框架,封裝了底層的mongodb-driver

API相似SpringDataJPA

官網主頁: https://projects.spring.io/spring-data-mongodb/

4.2.一、建立工程

  • 建立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.二、基本增刪改查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.三、根據方法命名查詢

與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.四、使用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

http://www.javashuo.com/article/p-zlwzjbgu-cs.html

相關文章
相關標籤/搜索