MongoDB学习笔记

MongoDB学习笔记

简单概念

MongoDB是一个介于关系型数据库和非关系型数据库之间的数据库产品,它存储的数据格式是BSON(JSON的二进制存储格式),mongoBD中的文档是它的一个存储单位,通过这种文档可以实现关系型数据的功能。

MongoDB中的一些概念可以对照MySQL的概念来理解

mysql mongoDB
数据库 数据库
集合
文档
字段
主键 _id
索引 索引

关系型数据库中典型的应用表连接的功能,在mongo中可以通过聚合操作来实现。

以上这些概念只是为了辅助快速理解mongodb,实际上还是有不同的,MongoDB是半结构化的存储,表的结构很松散,一个文档的字段并不是必须的,而且还支持嵌套和数组,从这点上来说,可以和面向对象完美契合,一个文档就是一个典型的对象。

MongoDB在支持的数据量,以及高并发时,要优于mysql

安装

官网:https://www.mongodb.com/try/download/community

1、在linux上安装,直接下载一个tar.gz的包,放在一个目录下,解压就好,为了方便再配置一个环境变量,不过不配也没关系,基本上不会通过命令行操作

2、创建两个目录

#创建dbpath和logpath
mkdir -p /mongodb/data /mongodb/log

3、启动服务端

#进入mongodb目录,启动mongodb服务
bin/mongod --port=27017 --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --bind_ip=0.0.0.0 --fork

--dbpath :指定数据文件存放目录
--logpath :指定日志文件,注意是指定文件不是目录
--logappend :使用追加的方式记录日志
--port:指定端口,默认为27017
--bind_ip:默认只监听localhost网卡
--fork: 后台启动
--auth: 开启认证模式

到这里其实就可以在项目中连接使用了

如果敲命令,可以进入Mongo shell

bin/mongo localhost:27017

然后就会进入类似mysql命令行的那种环境,里面可以执行mongodb的命令。

基本语法
#查看所有库
show dbs
# 切换到指定数据库,不存在则创建
use test
# 删除当前数据库  
db.dropDatabase()

#查看集合
show collections
#创建集合
db.createCollection("emp")
#删除集合
db.emp.drop()

#插入,db.后跟的是自己创建的集合名
db.emp.insertOne()
db.emp.insertMany()

#查询
db.emp.find(query, projection)
#条件查询,这里的tag,type,num都是文档中的字段
db.emp.find({tag:"xxx"})
db.emp.find({type:"xxx",num:{$gt:60}})

#指定按num降序返回
db.emp.find({tag:"xxx"}).sort({num:-1})
# 分页
db.emp.find().skip(8).limit(4)

#使用正则
db.emp.find({type:{$regex:"test"}})

#更新文档,默认只更新一个文档,如果要更新多个,加{"multi":true}
db.emp.update(query,update,options)
db.emp.update({type:"test"},{$set:{date:new Date()}},{"multi":true})

#删除
db.emp.remove({age:{$lt:25}})   // 删除age 小于25的记录
db.emp.remove( { } ) // 删除所有记录
db.emp.remove() //报错

查询逻辑运算符:
lt: 存在并小于lte: 存在并小于等于
gt: 存在并大于gte: 存在并大于等于
ne: 不存在或存在但不等于in: 存在并在指定数组中
nin: 不存在或不在指定数组中or: 匹配两个或多个条件中的一个
$and: 匹配全部条件</pre>

更新操作符

操作符 格式 描述
$set {$set:{field:value}} 指定一个键并更新值,若键不存在则创建
$unset {$unset : {field : 1 }} 删除一个键
$inc {$inc : {field : value } } 对数值类型进行增减
$rename {$rename : {old_field_name : new_field_name } } 修改字段名称
$push { $push : {field : value } } 将数值追加到数组中,若数组不存在则会进行初始化
$pushAll {$pushAll : {field : value_array }} 追加多个值到一个数组字段内
$pull {$pull : {field : _value } } 从数组中删除指定的元素
$addToSet {$addToSet : {field : value } } 添加元素到数组中,具有排重功能
$pop {$pop : {field : 1 }} 删除数组的第一个或最后一个元素
数据可靠性

mongoDB保证数据可靠性的机制包括两个部分:

1、CheckPoint(检查点)机制

每隔一段时间在内存中建立一个快照数据,这一阶段的数据都在内存中,定时持久化,默认是60s

2、Journal日志

将每个写操作写入journal缓冲区,每隔100ms写入到日志中,这样即使是特殊情况下,也最多会丢失100ms的数据。

springboot整合mongodb

只要开发过项目,在springboot中整合过mysql,再来整合mongodb真的就太简单了。

三步:

1、引入依赖

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>

2、添加配置,application.yaml,

spring:
  data:
    mongodb:
      uri: mongodb://192.168.17.100:27017/student

3、代码中注入MongoTemplate,调用它的CRUD的方法

@Autowired
    private MongoTemplate mongoTemplate;

    // 新增
    public void save(@PathVariable("name") String name){
        System.out.println("测试mongodb保存数据");
        Student student = new Student();
        student.setName(name);
        student.setAddress("北京");
        student.setAge(16);
        student.setGender("男");
        List<String> hobby = Arrays.asList("打球","打游戏","骑车");
        student.setHobby(hobby);
//        Student save = mongoTemplate.save(student);
//        System.out.println("保存成功save:" + save);
        Student insert = mongoTemplate.insert(student);
        System.out.println("保存成功insert:" + insert);
    }

    // 查询
    public void readAll(){
        List<Student> studentList = mongoTemplate.findAll(Student.class);
        System.out.println("查询mongodb列表:" + studentList);
    }
    public void queryById(@PathVariable("id") String id){
        Student stu = mongoTemplate.findById(id, Student.class);
        System.out.println("查询mongodb by id: " + stu);
    }
    public void query(){
        Query query = new Query(Criteria.where("name").is("zhangsan").and("age").is(16));
        List<Student> studentList = mongoTemplate.find(query, Student.class);
        System.out.println("根据条件查询mongodb: " + studentList);
    }
    // 使用正则查询
    public void queryRegex(){
        String reg = ".san.";
        Pattern pattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
        Query query = new Query(Criteria.where("name").regex(pattern));
        List<Student> studentList = mongoTemplate.find(query, Student.class);
        System.out.println(studentList);
    }
    // 分页
    public void page(){
        int pageNo = 1;
        int pageSize = 10;
        Query query = new Query();
        List<Student> studentList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), Student.class);
    }
    // 修改
    public void update(){
        Query query = new Query(Criteria.where("_id").is("xxx"));
        Update update = new Update();
        update.set("name", "tom+++");
        update.set("age", 22);
        UpdateResult upsert = mongoTemplate.upsert(query, update, Student.class);
    }
    // 删除
    public void delete(){
        Query query = new Query(Criteria.where("_id").is("xxx"));
        DeleteResult remove = mongoTemplate.remove(query, Student.class);
    }

Spring Data提供了对mongodb数据访问的支持,我们只需要继承MongoRepository类,按照Spring Data规范就可以了,其实具体语法在用到的时候查文档:https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/MongoTemplate.html

 @Autowired
    private StudentRepository studentRepository;

    // 查询
    public void findByRepository(){
        List<Student> all = studentRepository.findAll();
        System.out.println("通过repository查询" + all);
    }
    ......
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容