文档章节

MongoDB笔记整理

o
 osc_ucqb2u3q
发布于 07/01 12:09
字数 2750
阅读 32
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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

o
粉丝 0
博文 64
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Mongo DB命令简介

引言   最近在学习MongoDB 总结了一些命令及常用的东西做整理 常用目录文件介绍    mongod 数据库部署命令 mongo 连接mongodb数据库而使用的命令 mongoimport 导入功能 mongoexport 导出...

osc_tm2zceka
2018/06/25
2
0
手把手 linux下 MongoDB 的使用方法(二)

条件操作符 条件操作符用于比较两个表达式并从MongoDB集合中获取数据。 MongoDB中条件操作符有: 清空集合数据 插入以下数据 使用find()命令查看数据: 1.1 (>) 大于操作符 - $gt 类似于SQL...

小罗技术笔记
2019/12/21
18
0
手把手 linux下 MongoDB 的使用方法(一)

1、 创建数据库 语法 创建一个 user_data 的数据库,使用 db 命令查看 查看所有数据库使用show dbs 可以看到,刚创建的数据库 userdata 并不在数据库的列表中, 要显示它,我们需要向 userda...

小罗技术笔记
2019/12/24
16
0
面试阿里被分布式“搞懵”,Redis、MongoDB、memcached没答上来

都说大厂面试难,一点也没有错,一线大厂的面试究竟怎么样还得自己亲身经历了才知道。小白面试阿里,就被面试官吊打,一问分布式就被“搞懵”了,Redis、MongoDB、Memcached都没答好,很多没...

osc_89ruwfwe
2019/12/12
46
0
Mongodb学习文章辑录

以前学习必须通过看书,现在互联网上有太多资源,因此,网络时代的学习必须少不了搜索引擎的帮助。 本帖是通过搜索引擎帮助获取相关知识,并把资源网址分类整理,以供自己和大家以后方便阅读...

rockypeng
2014/05/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka如何在千万级别时优化JVM GC问题?

大家都知道Kafka是一个高吞吐的消息队列,是大数据场景首选的消息队列,这种场景就意味着发送单位时间消息的量会特别的大,那既然如此巨大的数据量,kafka是如何支撑起如此庞大的数据量的分发...

hummerstudio
06/18
0
0
我打赌!90%程序员都破解不了这个粽子,不信你试!

放假了 各位读者朋友们,马上就是端午小长假啦,开心激动有木有? 新的故事文章还在创作中,写了初稿感觉不太满意又推倒重来。其实写故事还是挺难的,读者可能第一次第二次有新鲜感,写多了就...

轩辕之风
06/24
0
0
如何删库跑路?教你使用Binlog日志恢复误删的MySQL数据

前言 “删库跑路”是程序员经常谈起的话题,今天,我就要教大家如何删!库!跑!路! 开个玩笑,今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文,你能够了解...

后端技术漫谈
01/14
0
0
PHP设计模式之代理模式

PHP设计模式之代理模式 代理人这个职业在中国有另外一个称呼,房产经济人、保险经济人,其实这个职业在国外都是叫做房产代理或者保险代理。顾名思义,就是由他们来帮我们处理这些对我们大部分...

硬核项目经理
2019/09/23
0
0
Redis的复制模式

Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操作。 同步 同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。 1. 旧版本的执行步骤 从服务器...

osc_s9cni3go
2分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部