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索引
相关推荐
Hacker_LaoYi35 分钟前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀37 分钟前
Redis梳理
数据库·redis·缓存
独行soc37 分钟前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天1 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺1 小时前
分布式系统架构:服务容错
数据库·架构
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain3 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship3 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站3 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶3 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb