MongoDB简介
MongoDB 是免费开源的跨平台 NoSQL 数据库,命名源于英文单词 humongous,意思是「巨大无比」,可见开发组对 MongoDB 的定位。
我们在本文主要学习一下内容:
- MongoDB基本概念集合文档;
- 安装并配置MongoDB服务器;
MongoDB基于NoSQL文档存储模型;在这种模型中,数据对象被存储为集合中的文档,而不是传统关系型数据库中的行和列。文档是以二进制JSON(BSON)对象的方式存储的。 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 MongoDB旨在实现一种高性能、高可用、可自动扩展的数据存储,它安装和实现起来都非常简单。MongoDB因为速度快、可扩展性强、易于实现,为需要存储用户评论、博客和其他内容的网站提供了极佳的后端存储解决方案。
主要特点
下面是MongoDB得以成为最受欢迎的NoSQL数据库的其他一些原因。
- 面向文档: MongoDB是面向文档的,数据在数据库中的存储格式与您要在服务器端脚本和客户端脚本中处理的格式非常接近。这避免了将数据在行和对象之间进行转换。
- 高性能: MongoDB是市面上性能最高的数据库之一。在当今世界,很多用户都与网站交互,因此拥有能够支持庞大流量的后端至关重要。
- 高可用性: MongoDB的复制模型使其很容易保持高可用性,同时能够提供高性能和高可扩展性。
- 高可扩展性: MongoDB的结构使得能够将数据分布到多台服务器,从而轻松地实现横向扩展。
- 对 SQL注入攻击免疫: MongoDB将数据存储为对象,而不使用SQL字符串,因此对SQL注入攻击(通过浏览器在Web表单中输入SQL语句,从而威胁DB的安全)免疫。
- MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
MongoDB概念
不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍。
下表将帮助您更容易理解Mongo中的一些概念:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
理解集合
MongoDB使用集合将数据编组。集合是一组用途相同或类似的文档,相当于传统SQL数据库中的表,但存在一个重要差别:在MongoDB中,集合不受严格模式的管制,其中的文档可根据需要采用稍微不同的结构。这样就无需将文档的内容放在多个不同的表中,而在SQL数据库中经常需要这样做。
理解文档
在MongoDB数据库中,文档表示单个实体的数据,而集合包含一个或多个相关的文档。MongoDB和SQL的一个主要差别在于文档不同于行:行数据是扁平的,每列都包含行中的一个值,而在MongoDB中,文档可包含嵌入的子文档,提供的数据模型与应用程序的要求更一致。
事实上,MongoDB中表示文档的记录是以BSON(一种轻量级二进制JSON)的方式存储的。BSON是一种轻量级二进制JSON,使用对应于JavaScript属性/值对的字段/值对来定义文档中存储的值。几乎不需要做任何转换,就能将MongoDB记录转换为您可能在应用程序中使用的JSON字符串。
例如,MongoDB中文档的结构可能类似于下面这样,其中包含字段name、version、languages、admin和paths:
{
name: "New Project",
version: 1,
languages: ["JavaScript", "HTML", "CSS"],
admin: {name: "Brad", password: "****"},
paths: {temp: "/tmp", project:"/opt/project", html: "/opt/project/html"}
}
注意到在这个文档结构中,包含类型为字符串、整数、数组和对象的字段/属性,就像JavaScript对象一样。
字段名不能包含空格、句点(.)和美元符号($)。另外,字段名_id保留用于存储对象ID(Object ID)。字段_id包含系统中独一无二的ID,这种ID由下列几部分组成:
- 从新纪元开始的秒数(4字节)。
- 3字节的机器标识符。
- 2字节的进程ID。
- 3字节的计数器(该计数器的起始值是随机的)。 MongoDB文档最大不能超过16MB,这旨在避免查询占用太多RAM或频繁访问文件系统。文档也许根本不会接近这样的规模,但设计包含文件数据的复杂类型时必须牢记这种最大文档限制。
Mongodb安装
有关如何下载并安装MongoDB,请参阅http://docs.mongodb.org/manual/installation/。
Docker安装MongoDB
下面是使用Docker安装MongoDB
查看可用的 MongoDB 版本
访问 MongoDB 镜像库地址: https://hub.docker.com/_/mongo?tab=tags&page=1。 可以通过 Sort by 查看其他版本的 MongoDB,默认是最新版本 mongo:latest。 我们还可以用 docker search mongo 命令来查看可用版本:
取最新版的 MongoDB 镜像
docker pull mongo:latest
运行容器
安装完成后,我们可以使用以下命令来运行 mongo 容器:
$ docker run -itd --name mongo -p 27017:27017 mongo --auth
参数说明:
-p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。
--auth:需要密码才能访问容器服务。
--httpinterface --rest :如何需要http服务需要添加这些参数
安装成功
接着使用以下命令添加用户和设置密码,并且尝试连接。
$ docker exec -it mongo mongo admin
# 创建一个名为 admin,密码为 admin 的用户。
MongoDB 6.0 及以上版本使用以下命令:
docker exec -it mongo mongosh admin
然后创建用户
> db.createUser({ user:'admin',pwd:'admin',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接。
> db.auth('admin', 'admin')
在Docker中部署mongodb集群
docker 部署mongo集群(replSet )
docker run -itd --restart=always --name mongo -p 27017:27017 mongo --replSet colonyReplSet
登录进容器,连接mongodb,并创建集群:(只需要在主节点执行)
docker exec -it mongodb /bin/bash
进入mongodb
> rs.initiate()
> rs.add("node002.example.com")
> rs.add("node003.example.com")
或者修改配置文件
config={
#注意这个id要和容器启动replSet 参数一样
"_id" : "colonyReplSet",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" : "localhost:27017",
"priority" : 6
},
{
"_id" : 1,
"host" : "localhost:27018",
"priority" : 3
},
{
"_id" : 2,
"host" : "localhost:27019",
"priority" : 2
}
]
}
查看状态
rs.status()
访问MongoDB HTTP接口
MongoDB内置了一个HTTP接口,可向您提供有关MongoDB服务器的信息。HTTP接口提供了有关MongoDB服务器的状态信息,还提供了一个REST接口,让您能够通过REST调用来访问数据库。
在大多数情况下,您都将在应用程序中使用编程语言专用的驱动程序来访问MongoDB数据库。然而,使用HTTP接口通常有助于获悉如下信息。
- 版本。
- 数据库个数。
- 活动游标数。
- 复制信息。
- 客户端信息,包括锁和查询。
- DB日志视图。 要访问MongoDB HTTP接口,可访问该接口的端口28017。
从MongoDB shell访问MongoDB
安装、配置并启动MongoDB后,便可通过MongoDB shell访问它了。MongoDB shell是MongoDB自带的一个交互式JavaScript shell,让您能够访问、配置和管理MongoDB数据库、用户等。使用这个shell可执行各种任务,从设置用户账户到创建数据库,再到查询数据库内容,无所不包。
MongoDB shell命令
MongoDB shell提供了多个命令,您可在shell提示符下执行它们。
- help
- use
修改当前数据库句柄。数据库操作是在当前数据库句柄上进行的 - show
- log [name] 显示内存中日志的最后一部分。如果没有指定日志名,则默认为global
- exit 退出MongoDB shell
MongoDB shell原生方法和构造函数
- Date() 创建一个Date对象。默认情况下,创建一个包含当前日期的Date对象
- UUID(hex_string) 将32字节的十六进制字符串转换为BSON子类型UUID
- ObjectId.valueOf() 将一个ObjectId的属性str显示为十六进制字符串
- Mongo.getDB(database) 返回一个数据库对象,它表示指定的数据库
- Mongo(host:port) 创建一个连接对象,它连接到指定的主机和端口
- connect(string) 连接到指定MongoDB实例中的指定数据库。返回一个数据库对象。连接字符串的格式如下:host:port/database,如db = connect(“localhost:28001/myDb”)
- cat(path) 返回指定文件的内容
- version() 返回当前MongoDB shell实例的版本
- cd(path) 将工作目录切换到指定路径
- getMemInfo() 返回一个文档,指出了MongoDB shell当前占用的内存量
- hostname() 返回运行MongoDB shell的系统的主机名
- _isWindows() 如果MongoDB shell运行在Windows系统上,就返回true;如果运行在UNIX或Linux系统上,就返回false
- load(path) 在MongoDB shell中加载并运行参数path指定的JavaScript文件
- _rand() 返回一个0~1的随机数