MongoDB 教程(第一章)

MongoDB是⼀个 基于分布式⽂件存储的数据库 。由C++语⾔编写。旨在 为WEB应⽤提供可扩展⾼性能数据存储解决⽅案 。
MongoDB是⼀个 介于关系数据库和⾮关系数据库 之间的文档数据库产品,是⾮关系数据库当中功能最丰富,最像关系数据库的。他⽀持的数据结构⾮常松散,是类似json的bson格式,因此可以存储⽐较复杂的数据类型 。Mongo最⼤的特点是他⽀持的查询语⾔⾮常强⼤,其语法有点类似于⾯向对象的查询语⾔, ⼏乎可以实现类似关系数据库单表查询的绝⼤部分功能,⽽且还⽀持对数据建⽴索引

公众号 : 倔强小狮子

在这里插入图片描述


1. 特点

  • ⾯向集合存储,易存储对象类型的数据
  • ⽀持查询,以及动态查询
  • ⽀持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语⾔
  • ⽂件存储格式为BSON(⼀种JSON的扩展)
  • ⽀持复制和故障恢复和分⽚
  • ⽀持事务⽀持(4版本之前不支持事务)
  • 索引 聚合 关联…

2. 普通安装

  1. 下载 MongoDB MongoDB
    在这里插入图片描述
  2. 解压,查看安装目录结构
    在这里插入图片描述
  • 2.1 bin⽬录 ⽤来存放启动mongoDB的服务以及客户端链接的脚本⽂件等
  • 2.2 启动 MongoDB MongoDB 服务
    ./mongod --port=27017 --dbpath=../data --logpath=../logs/mongo.log
    --port 指定服务监听端⼝号 默认为 27017
    --dbpath 指定 mongodb 数据存放⽬录 启动要求⽬录必须存在
    --logpath 指定 mongodb ⽇志⽂件存放位置
  • 2.3 客户端连接
    ./mongo --port=27017
    在这里插入图片描述

3 Docker 安装

  1. 拉取 mongodb mongodb 镜像
    docker pull mongo:5.0.5
  2. 运⾏ mongo mongo 镜像
    docker run -d --name mongo --p 27017:27017 mongo:5.0.5
  3. 进入mongo 容器
    docker exec -it bc6192dcddg3s91dzw bash

4. 核心概念

4.1 库

  • mongodb中的库就类似于传统关系型数据库中库的概念,⽤来通过不同库隔离不同应⽤数据 。
  • mongodb中可以建⽴多个数据库。
  • 每⼀个库都有⾃⼰的集合和权限,不同的数据库也放置在不同的⽂件中。
  • 默认的数据库为"test",数据库存储在启动指定的data⽬录中。

4.2 集合

  • 集合就是 MongoDB ⽂档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表的概念 。
  • 集合存在于数据库中,⼀个库中可以创建多个集合。
  • 每个集合没有固定的结构,这意味着你在对集合可以插⼊不同格式和类型的数据,但通常情况下我们插⼊集合的数据都会有⼀定的关联性。

4.3 文档

  • ⽂档集合中⼀条条记录,是⼀组键值(key-value)对(即 BSON)。
  • MongoDB 的⽂档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很⼤的区别,也是 MongoDB ⾮常突出的特点。
  • ⼀个简单的⽂档例⼦如下: {"addr":"www.baidu.com", "name":"百度网站"}

4.4 关系总结

RDBMS数据库MongoDB数据
数据库数据库
表 集合
文档
字段

5. 核心操作

5.1 库

  • 查看所有库
    show databases; | show dbs;
    在这里插入图片描述
    PS 注意:

    • admin : 从权限的⻆度来看,这是"root"数据库。要是将⼀个⽤户添加到这个数据库,这个⽤户⾃动
      继承所有数据库的权限。⼀些特定的服务器端命令也只能从这个数据库运⾏,⽐如列出所有的数据库
      或者关闭服务器。
    • local : 这个数据永远不会被复制,可以⽤来存储限于本地单台服务器的任意集合
    • config : 当Mongo⽤于分⽚设置时,config数据库在内部使⽤,⽤于保存分⽚的相关信息
  • 创建数据库

    • use 库名
      在这里插入图片描述
      PS 注意: use 代表创建并使⽤,当库中没有数据时默认不显示这个库
  • 使用数据库并插入一条数据

    • db.users.insert({"addr":"www.baidu.com","name":"百度网站"});
      在这里插入图片描述
  • 删除数据库

    • db.dropDatabase();
      在这里插入图片描述

6 集合

  • 查看所有集合
    show collections; | show tables;
  • 创建集合
    • db.createCollection('集合名称', [options])
      在这里插入图片描述PS 注意:当集合不存在时,向集合中插⼊⽂档也会⾃动创建该集合
  • 删除集合
    db.集合名称.drop();
    在这里插入图片描述

7. ⽂档

  • 插⼊⽂档
    • 单条⽂档
      db.集合名称.insert({"addr":"www.baidu.com","name":"百度网站"});

    • 多条⽂档
      db.集合名称.insert([{"addr":"www.baidu.com","name":"百度网站"},{"addr":"https://spring.io/","name":"Spring官网"}]);

    • 查询所有
      db.集合名称.find();

    • 删除⽂档
      db.集合名称.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )

    • 参数说明:

      • query : 可选 删除的⽂档的条件。
      • justOne : 可选 如果设为 true 或 1,则只删除⼀个⽂档,如果不设置该参数,或使⽤默认值 false,则删除所有匹配条件的⽂档。
      • writeConcern : 可选 抛出异常的级别
      • 注意:在 mongodb 中每个⽂档都会有⼀个_id作为唯⼀标识,_id默认会⾃动⽣成如果⼿动指定将使⽤⼿动指定的值作为_id 的值。
    • 更新⽂档
      db.集合名称.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } );

    • 参数说明:

      • query : update的查询条件,类似sql update查询内where后⾯的。
      • update : update的对象和⼀些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后⾯的
      • upsert : 可选 ,这个参数的意思是,如果不存在update的记录,是否插⼊objNew,true为插⼊,默认是false,不插⼊。
      • multi : 可选 ,mongodb 默认是false,只更新找到的第⼀条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
      • writeConcern : 可选 ,抛出异常的级别
    • db.集合名称.update({“name”:“张三”},{name:“李四”,bir:new date()})
      这个更新是将符合条件的全部更新成后⾯的⽂档,相当于先删除在更新

    • db.集合名称.update({“name”:“张三”},{$set:{name:“李四”}})
      保留原来数据更新,但是只更新符合条件的第⼀条数据

    • db.集合名称.update({name:”张三”},{$set:{name:”⼩明”}},{multi:true})
      保留原来数据更新,更新符合条件的所有数据

    • db.集合名称.update({name:”张三”},{$set:{name:”⼩明”}},{multi:true,upsert:true})
      `保留原来数据更新,更新符合条件的所有数据 没有条件符合时插⼊数据

8.⽂档查询

MongoDB 查询⽂档使⽤ find() ⽅法。find() ⽅法以⾮结构化的⽅式来显示所有⽂档。

  • 语法
    db.集合名称.find(query, projection)
    • query :可选,使⽤查询操作符指定查询条件
    • projection :可选,使⽤投影操作符指定返回的键。查询时返回⽂档中所有键值, 只需省略该参数即可
      (默认省略)
  • 如果你需要以易读的⽅式来读取数据,可以使⽤ pretty() ⽅法,语法格式如下:
    db.集合名称.find().pretty()
    注意: pretty() ⽅法以格式化的⽅式来显示所有⽂档
  • 对⽐语法
操作格式范例RDBMS类似语句
等于{ < key > : < value > }db.col.find({“name”:“张三”}).pretty()where name=“张三”
小于{ < key > { $lt: < value > } }db.col.find({“age”:"$lt:18"}).pretty()where age < 18
小于或等于{ < key > : { $lte: < value > } }db.col.find({“age”:"$lte:18"}).pretty()where age <= 18
大于{ < key > : { $gt: < value > }}db.col.find({“age”:"$gt:18"}).pretty()where age > 18
大于或等于{ < key > : { $gte: < value > } }db.col.find({“age”:"$gte:18"}).pretty()where age >= 18
不等于{< key >: { $ne: < value > } }db.col.find({“age”:"$ne:18"}).pretty()where age != 18
  • AND
    db.集合名称.find({key1:value1, key2:value2,...}).pretty()
    类似于 WHERE 语句:WHERE key1=value1 AND key2=value2

  • OR
    db.集合名称.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty()
    类似于 WHERE 语句:WHERE key1=value1 or key2=value2

  • AND 和 OR 联合
    类似SQL语句为:'where age >50 AND (name = '编程不良⼈' OR name = 'MongoDB')'
    db.集合名称.find({"age": {$gt:50}, $or: [{"name": "编程不良⼈"},{"name": "MongoDB"}]}).pretty();

  • 数组中查询

    • 测试数据
      db.集合名称.insert({ "_id" : 11, "age" : 29, "likes" : [ "看电视", "读书xx" ], "name" : "张三_11" })
    • 执⾏数组查询
      db.users.find({likes:"看电视"})
    • $ size 按照数组⻓度查询
      db.users.find({likes:{$size:3}});
  • 模糊查询
    类似 SQL 中为 'where name like '%name%''
    db.users.find({likes:/张/});
    注意:在 mongoDB 中使⽤正则表达式可以是实现近似模糊查询功能

  • 排序
    db.集合名称.find().sort({name:1,age:1})
    1 升序 -1 降序
    类似 SQL 语句为: 'order by name,age'

  • 分⻚
    db.集合名称.find().sort({条件}).skip(start).limit(rows);
    类似于 SQL 语句为: 'limit start,rows'

  • 总条数
    db.集合名称.count();
    db.集合名称.find({"name":"张三"}).count();
    类似于 SQL 语句为: 'select count(id) from ....'

  • 去重
    db.集合名称.distinct('字段')
    类似于 SQL 语句为: 'select distinct name from ....'

  • $type

    • $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
  • MongoDB 中可以使⽤的类型如下表所示:

类型数字备注
Double1
String2
Object3
Array4
Binary data5
Undefined6废弃
Object id7
Boolean8
Date9
Null10
Regular Expression11
JavaScript13
Symbol14
JavaScript(with scope)15
32-bit integer16
Timestamp17
64-bit integer18
Min key255
Max key127
  • 使⽤
    db.col.insert({ title: 'java 教程', description: "Java语言', by: '开发', url: 'http://spring.io', tags: ['java'], likes: 200 });

    db.col.insert({ title: 'Java 教程', description: 'Java 是由Sun Microsystems公司于1995年5⽉推出的⾼级程序设计语⾔。', by: '编程不良⼈', url: 'http://www.baizhiedu.xin', tags: ['java'], likes: 550 });

    db.col.insert({ title: 'MongoDB 教程', description: 'MongoDB 是⼀个 Nosql 数据库', by: '编程不良⼈', url: 'http://www.baizhiedu.xin', tags: ['mongodb'], likes: 100 });

    • 如果想获取 “col” 集合中 title 为 String 的数据,你可以使⽤以下命令:
      db.col.find({"title" : {$type : 2}}).pretty(); 或 db.col.find({"title" : {$type : 'string'}}).pretty();

    • 如果想获取 “col” 集合中 tags 为 Array 的数据,你可以使⽤以下命令:
      db.col.find({"tags" : {$type : 'array'}}).pretty();

期待你的关注,和我一起学习
转载说明:转载携带原文链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值