MongoDB基础认识

MongoDB数据库介绍

  • 名称源自"humongous"(意为"巨大无比")。
  • MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
  • 在高负载的情况下,添加更多的节点,可以保证服务器性能。
  • MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  • 官方网站:https://www.mongodb.com/
  • 官方文档:https://www.mongodb.com/docs/manual/
  • MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成.MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
  • 主要特点:
    • 提供了一个面向文档存储,操作起来比较简单和容易
    • 可以设置任何属性的索引来实现更快的排序
    • 具有较好的水平可扩展性
    • 支持丰富的查询表达式,可轻易查询文档中内嵌的对象及数组
    • 可以实现替换已完成文档的一些指定的数据字段
    • MongoDB可以对数据进行批量处理和聚合操作
    • 支持复制和故障恢复
    • 支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等语言
    • MongoDB安装简单
  • 适用场景:MongoDB更多适合于大数据量、高并发、弱事务的互联网应用,其内置的水平扩展机制提供了从几百万到十亿级别的数据处理能力,可以很好的满足Web2.0和移动互联网应用的数据存储要求。

MongoDB数据库的安装和使用

  • MongoDB Server下载地址: https://www.mongodb.com/download-center/community
  • Shell客户端下载地址:https://www.mongodb.com/products/shell
  • MongoDB Compass图形化客户端下载地址: https://www.mongodb.com/products/compass
  • 启动/关闭MongoDB服务:
    • MongoDB安装目录的bin目录下,双击mongod.exe,即可启动服务
    • 关闭MongoDB服务在计算机服务中停止即可。
  • 使用MongoDB服务:
    • MongoDB Shell是MonoDB客户端工具,可以在Shell中使用命令与MongoDB实例交互,对数据库的管理操作(CURD、集群配置、状态查看等)都可以通过MongoDB Shell来完成。
    • MongoDB Shell = JavaScirpt解释器 + MongoDB客户端
  • 使用MongoDB Shell访问MongoDB:
    • 双击mongosh.exe,输入命令mongodb://127.0.0.1:27017,其中127.0.0.1为所连机器的ip,27017为默认的MongoDB端口号
    • 默认的数据库为test数据库
  • 使用MongoDB Shell运行js脚本:
    • OS命令行下,运行一个js文件,Mongosh的bin目录添加到环境变量中,命令行中输入 mongosh [--quiet] D:/script.js
    • 在mongo shell 交互模式下,运行一个js文件输入 load('D:/script.js')
    • .mongoshrc.js 文件(位于用户主目录)启动shell时会自动加载运行,加上--norc参数,就可以禁止加载

MongoDB概念解析

解析

举例:在一个关系型数据库中,一篇博客(包含文章内容、评论、评论的投票)会被打散在多张数据表中。在文档数据库MongoDB中,能用一个文档来表示一篇博客, 评论与投票作为文档数组,放在正文主文档中。这样数据更易于管理,消除了传统关系型数据库中影响性能和水平扩展性的"JOIN"操作:

数据库

  • 一个Mongodb中可以建立多个数据库
  • MongoDB的默认数据库为"test",该数据库存储在data目录中
  • MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中
  • 多个文档组成集合,而多个集合组成了数据库
  • show dbs 命令可以显示所有数据库的列表

数据库命名

  • 不能是空字符串("")
  • 不能以$开头
  • 不能含有.和空字符串。
  • 数据库名字区分大小写(建议数据库名全部使用小写)
  • 数据库名字长度最多64字节。
  • 不要与系统保留的数据库名字相同,这些数据库包括:admin、local、 config等

集合

  • 集合就是 MongoDB文档组,类似于RDBMS 中的表格。
  • 集合存在于数据库中,没有固定的结构,这意味着可对集合可以插入不同格式和类型的数据
  • MongoDB 数据类型较多,有字符型、整型、布尔型、双精度等
  • MongDB提供了一些特殊功能的集合,例如:capped、collection,system.indexes,system.namespaces等。

集合命名

  • 集合名不能是空字符串""
  • 集合名不能含有\0字符(空字符),(表示集合名的结尾)
  • 集合名不能以system.开头,此前缀是系统本身保留的
  • 集合名中不能包含$字符(注:可包含.)

文档

  • 文档是MongoDB最核心的概念,本质是一种类JSON的BSON格式的数据。
  • BSON是一种类JSON的二进制格式数据,它可以理解为JSON基础上添加了一些新的数据类型,包括日期、int32、int64等。
  • BSON是由一组组键值对组成,它具有轻量性、可遍历性和高效性三个特征。可遍历性是MongoDB将BSON作为数据存储的主要原因。
  • BSON官网地址:http://bsonspec.org/

文档注意

  • MongoDB中写操作的原子性限制在文档级别,对文档的保存、修改、删除等都是原子操作
  • 单个文档占用的存储空间不能超过16MB
  • MongoDB会尽量保持文档被插入时键值对的顺序

文档命名

  • _id是系统保留的关键字,它是默认的主键,该值在集合中必须唯一,且不可修改
  • 键不能包含\0或空字符。(这个字符用于表示键的结尾)
  • 不能以$开头
  • 不能包含.(点号)
  • 键是区分大小写的且不能重复 例如:{foo:1,Foo:1}

命名空间

  • 把数据库名添加到集合名字前面,中间用点号连接,得到集合的完全限定名,就是命名空间,例如:命名空间database.parent 。
  • 需要说明的是,点号还可以出现在集合名字中,例如:parent.subling0,parent.subling1可以将subling0和subling1集合看作是parent集合的子集合。
  • 使用子集合可以使我们更好的组织数据,使数据的结构更加清晰明了

简单语句

  1. 创建/切换数据库:use db1
  2. 查看所有数据库:show dbs
  3. 删除当前数据库:db.dropDatabase()
  4. 创建集合:db.createCollection("c1")
  5. 创建集合并添加数据db.dept.insertOne({deptno:1,deptname:"技术部",location:"beijing"})
  6. 查看集合:show collections
  7. 删除集合:db.collection_name.drop()
  8. 查看所有文档数据:db.dept.find()
  9. 查看单独的一个文档:db.dept.findOne()

MongoDB数据类型简介

BSON可以理解为在JSON基础上添加了一些新的数据类型,包括Date,正则表达式,对数值类型的更进一步划分等。

  • MongoDB 中 $type 是一个条件操作符。 $type 基于 BSON 类型来检索集合中匹配的数据类型,并返回结果。
  • 由于 MongoDB 对于文档(记录)的格式要求比较自由,所以同一个KEY(字段)中可以包含不同类型的数值。$type 用于过滤指定类型的数据:
    • db.collection.find({KEY : {$type : TYPE_NAME}})
    • db.stu.find({name:{$type:2}})

MongoDB数据类型应用

  • null :表示空值或不存在的字段。 例如db.collection.find({age:null})
  • 布尔:有两个值true或false 。例如:{y:true}
  • 数值类型: 支持32-int、64-int以及64-double如果使用mongodb shell表示数字,默认都是浮点型
    • {y:10} -- double
    • y:NumberInt(10)} - 32
    • {y:NumberLong(10)} - 64
  • 字符串:使用UTF-8对字符串进行编码。例如:{y:"Hello MongoDB"}
  • 二进制数据可以保存由任意字节组成的字符串,例如:图片、视频等。
  • 正则表达式:主要用于查询,使用正则表达式作为限定条件
    • {name:/foo/} name字段含有foo的文档
    • {name:/foo/i} name字段含有foo的文档,且不区分大小写
    • {name:/^foo/i} name字段以foo幵头,且不区分大小写
  • JavaScript代码:文档中可以包含任意的JavaScript代码
    • {func:function functionname( ){}}
  • Date日期:MongoDB中,日期类型是一个64位的整数,它代表的是Unix epoch的毫秒数,MongoDB在存储时间时,先转化为UTC时间
    • 北京时间(CST) = UTC + 8个小时
    • MongoDBShell中可以使用new Date或ISODate来创建时间对象,使用Date以字符串的形式返回当前日期。
  • 时间戳类型有两部分组成:Timestamp只供MongoDB数据库服务内部使用,用于记录操作的详细时间,Timestamp类型和Date类型是没有关系的,对于我 们来说使用更多的Date类型。
    • 获取当前时间的时间戳:Date.parse(new Date())
  • ObjectId:由24个十六进制字符构成,每个字节存储两位十六进制数字,总共需要12字节存储空间
    • 例如:{"_id":ObjectId("5a7866e75640374fb2cd5623")}

    • 每个字节代表的含义如下:

    • 相关函数:

      • ObjectId() 用于创建ObjectID
      • getTimestamp() 用于取得ObjectID的时间戳
      • valueOf() 用于取得ObjectID的字符串表示
  • 内嵌文档:文档可以作为键的值,这样的文档称为内嵌文档。内嵌文档可以使数据不用保存成扁平结构的键值对,从而使数据组织方式更加自然。
    例如:下面是一个与博客管理有关的文档
    { _id: ,
    title: MongoDBDateModeln,
    author: foo,
    comments:[
    {who:"John",comment:"Good"},
    {who:"Joe",comment:"ExceUent"}]
    }
  • 数组:数组是使用[]来表示的一组值,它既可以作为有序对象(列表、栈、队列),也能作为无序对象(如集合)来操作。
  • 数组中可以包含不同数据类型的元素(字符串、浮点数、文档等)
    例如:[3.14,"hello",[l2,3],{"key":"MongoDB"}]
  • 针对数组MongoDB提供了许多特定的操作符,例如:$ push, $ pop,$ pull,$ slice,$addToSet等
  • MongoDB可自动的为数组元素建立Multikey索引
相关推荐
Wang's Blog44 分钟前
Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
数据库·redis
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO1 小时前
MySQL事务
数据库·mysql
cyt涛3 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Rookie也要加油3 小时前
01_SQLite
数据库·sqlite
liuxin334455663 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
看山还是山,看水还是。4 小时前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec4 小时前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa4 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke5 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D5 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa