本文目录
  1. 1、MongoDB简介
    1. 1.1、什么是MongoDB
    2. 1.2、MongoDB体系结构
    3. 1.3、数据类型
  2. 2.MongoDB 安装
    1. 2.1 、windows安装
    2. 2.2、linux安装
    3. 2.3、docker安装
  3. 3、常用命令
    1. 3.1、选择和创建数据库
    2. 3.2、插入与查询文档
      1. 插入文档
      2. 查询文档
    3. 3.3、修改和删除文档
      1. 修改文档
      2. 删除文档
    4. 3.4、统计条数
    5. 3.5、模糊查询
    6. 3.6、大于 小于 不等于
    7. 3.7、包含与不包含
    8. 3.8、条件连接
    9. 3.9、列值增长
  4. 4、java操作mongodb
    1. 4.1、mongodb-driver
      1. 4.1.1、查询全部
      2. 4.1.2、插入数据
      3. 4.1.3、条件查询
    2. 4.2、SpringDataMongoDB
      1. 4.2.1、创建工程
      2. 4.2.2、基本增删改查API的实现
      3. 4.2.3、根据方法命名查询
      4. 4.2.4、使用MongoTemplate
    3. 相关文档

分类: 数据库 | 标签: MongoDB 数据库

MongoDB笔记

发表于: 2020-06-30 09:55:14 | 字数统计: 3.4k | 阅读时长预计: 16分钟

1、MongoDB简介

1.1、什么是MongoDB

MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热
门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最
像关系数据库的产品。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以
存储比较复杂的数据类型。

对于数据量较大且价值较低的数据,可以使用mongodb减轻mysql的压力

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

1592807836805

1.2、MongoDB体系结构

MongoDB 的逻辑结构是一种层次结构。主要由:
文档(document)集合(collection)数据库(database)这三部分组成的。逻辑结构是面
向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
(1)MongoDB 的文档(document),相当于关系数据库中的一行记录。
(2)多个文档组成一个集合(collection),相当于关系数据库的表。
(3)多个集合(collection),逻辑上组织在一起,就是数据库(database)。
(4)一个 MongoDB 实例支持多个数据库(database)。
文档(document)、集合(collection)、数据库(database)的层次结构如下图:

1592807996776

下表是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

------ 本文结束,感谢您的阅读 ------
本文作者: 程序员青阳
版权声明: 本文采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。