MongoDB快速入门
创建数据库
use DATABASE_NAME 用于创建数据库。该命令如果数据库不存在,将创建一个新的数据库, 否则将返回现有的数据库。
语法:
use DATABASE_NAME
要检查当前选择的数据库使用命令 db
如果想查询数据库列表,那么使用命令 show dbs
MongoDB的默认数据库是test。 如果没有创建任何数据库,那么集合将被保存在测试数据库。
删除数据库
MongoDB db.dropDatabase() 命令用于删除现有的数据库。
语法:
db.dropDatabase()
eg.如果想删除新的数据库 <mydb>, 那么 dropDatabase() 命令将如下所示:
创建集合
MongoDB 的 db.createCollection(name, options) 用于创建集合。 在命令中, name 是要创建集合的名称。 Options 是一个文档,用于指定集合的配置
| 参数 | 类型 | 描述 |
|---|---|---|
| Name | String | 要创建的集合的名称 |
| Options | Document | (可选)指定有关内存大小和索引选项 |
选项参数是可选的,所以只需要到指定的集合名称。以下是可以使用的选项列表:
| 字段 | 类型 | 描述 |
|---|---|---|
| capped | Boolean | (可选)如果为true,则启用封顶集合。封顶集合是固定大小的集合,会自动覆盖最早的条目,当它达到其最大大小。如果指定true,则需要也指定尺寸参数。 |
| autoIndexID | Boolean | (可选)如果为true,自动创建索引_id字段的默认值是false。 |
| size | number | (可选)指定最大大小字节封顶集合。如果封顶如果是 true,那么你还需要指定这个字段。 |
| max | number | (可选)指定封顶集合允许在文件的最大数量。 |
当插入文档,MongoDB 第一检查大小字段封顶集合,然后它会检查最大的字段中。
createCollection() 方法不使用选项的基本语法如下:
可以检查通过使用创建的集合命令 show collections
下面的例子显示了几个重要的选项 createCollection()方法的语法:
>db.createCollection("mycol", { capped : true, autoIndexID : true, size : 6142800, max : 10000 } )
{ "ok" : 1 }
>
在MongoDB中,不需要创建集合。当插入一些文档 MongoDB 自动创建的集合。
删除集合
MongoDB 的 db.collection.drop() 是用来从数据库中删除一个集合。
语法:
db.COLLECTION_NAME.drop()
MongoDB 数据类型
MongoDB支持许多数据类型的列表下面给出:
-
String : 这是最常用的数据类型来存储数据。在MongoDB中的字符串必须是有效的UTF-8。
-
Integer : 这种类型是用来存储一个数值。整数可以是32位或64位,这取决于您的服务器。
-
Boolean : 此类型用于存储一个布尔值 (true/ false) 。
-
Double : 这种类型是用来存储浮点值。
-
Min/ Max keys : 这种类型被用来对BSON元素的最低和最高值比较。
-
Arrays : 使用此类型的数组或列表或多个值存储到一个键。
-
Timestamp : 时间戳。这可以方便记录时的文件已被修改或添加。
-
Object : 此数据类型用于嵌入式的文件。
-
Null : 这种类型是用来存储一个Null值。
-
Symbol : 此数据类型用于字符串相同,但它通常是保留给特定符号类型的语言使用。
-
Date : 此数据类型用于存储当前日期或时间的UNIX时间格式。可以指定自己的日期和时间,日期和年,月,日到创建对象。
-
Object ID : 此数据类型用于存储文档的ID。
-
Binary data : 此数据类型用于存储二进制数据。
-
Code : 此数据类型用于存储到文档中的JavaScript代码。
-
Regular expression : 此数据类型用于存储正则表达式
MongoDB 插入文档
要插入数据到 MongoDB 集合,需要使用 MongoDB 的 insert() 或 save() 方法。
语法:
>db.COLLECTION_NAME.insert(document)
这里 article 是集合的名称,在前面创建的。如果集合在数据库中不存在,那么MongoDB 将创建此集合,然后把它插入文档。
插入文档中,如果我们不指定_id参数,然后MongoDB 本文档分配一个独特的ObjectId。
如果要一次性插入多个文档,可以传递一个数组给 insert() 。
>db.post.insert([
{
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'tutorials test',
url: 'http://www.test.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
title: 'NoSQL Database',
description: 'NoSQL database doesn't have tables',
by: 'tutorials test',
url: 'http://www.test.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 20,
comments: [
{
user:'user1',
message: 'My first comment',
dateCreated: new Date(2013,11,10,2,35),
like: 0
}
]
}
])
要插入文档,也可以使用 db.post.save(document)。 如果不指定_id在文档中,那么 save() 方法和 insert()方法工作一样。如果指定_id,它会替换整个数据文件,其中包含_id 指定save()方法。
MongoDB 查询文档
要从MongoDB 查询集合数据,需要使用MongoDB 的 find() 方法。
语法:
>db.COLLECTION_NAME.find()
find() 方法将在非结构化的方式显示所有的文件。
结果显示在一个格式化的方式,可以使用 pretty() 方法.
除了find() 方法外,还有一个 findOne() 法,返回一个文件。
RDBMS Where子句和MongoDB等同语句
要查询文件的一些条件的基础上,可以使用下面的操作
| 操作 | 语法 | 例子 | RDBMS 等同 |
|---|---|---|---|
| Equality | {<key>:<value>} | db.mycol.find({"by":"tutorialstest"}).pretty() | where by = 'tutorials test' |
| Less Than | {<key>: {$lt:<value>}} | db.mycol.find({"likes":{$lt:50}}).pretty() | where likes < 50 |
| Less Than Equals | {<key>:{$lte:<value>}} | db.mycol.find({"likes":{$lte:50}}).pretty() | where likes <= 50 |
| Greater Than | {<key>:{$gt:<value>}} | db.mycol.find({"likes":{$gt:50}}).pretty() | where likes > 50 |
| Greater Than Equals | {<key>:{$gte:<value>}} | db.mycol.find({"likes":{$gte:50}}).pretty() | where likes >= 50 |
| Not Equals | {<key>:{$ne:<value>}} | db.mycol.find({"likes":{$ne:50}}).pretty() | where likes != 50 |
AND 在MongoDB中用法
在 find() 方法,如果通过多个键分离',',那么 MongoDB 处理 AND 条件。AND 基本语法如下所示:
>db.mycol.find({key1:value1, key2:value2}).pretty()
对于上面给出的例子相当于where子句 ' where age='30' AND email='test@qq.com' , 可以通过任意数量的键值对在 find 子句。
MongoDB中OR
OR条件的基础上要查询文件,需要使用$or关键字。OR 基本语法如下所示:
>db.mycol.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
AND 和 OR 一起使用
下面的例子等效于 SQL where子句 为 'where age>10 AND (name = 'zhangsan' OR email = 'test@qq.com')'
MongoDB 更新文档
MongoDB的 update() 和 save() 方法用于更新文档的集合。 update()方法更新现有的文档值,而替换现有的文档通过的文件中 save() 方法。
1.update()方法更新现有文档值。
语法:
>db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)
MongoDB默认将只更新单一的文件,来更新多个你需要设置参数置'multi' 为true
>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}},{multi:true})
2.save() 方法替换现有的文档通过save() 方法
MongoDB 的 save() 方法的基本语法如下:
>db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})
MongoDB 删除文档
MongoDB的 remove() 方法用于从集合中删除文档。remove() 方法接受两个参数。第一个是删除criteria ,第二是justOne标志:
-
deletion criteria :(可选)删除标准,根据文件将被删除。
-
justOne : (可选)如果设置为true或1,只删除一个文件。
基本语法remove()方法如下
>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
下面的例子将删除所有的文件,其年龄为20
只删除一个
如果有多个记录且要删除的只有第一条记录,那么设置remove()方法中justOne参数
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
删除所有文档
如果不指定删除条件,然后MongoDB将从集合中删除整个文档。这相当于SQL的truncate命令。
MongoDB 投影
mongodb 投影意思是只选择必要的数据而不是选择一个文件的数据的整个。如果一个文档有5个字段,需要显示只有3个,然后选择其中只有3个字段。
MongoDB 的find()方法,在 MongoDB查询 文档解释接受第二个可选参数是要检索的字段列表。在MongoDB中,当执行find()方法,那么它会显示一个文档所有字段。要限制这一点,需要设置的字段列表值1或0。 1用来显示字段而0是用来隐藏字段。
find()方法具有投影基本语法如下:
>db.COLLECTION_NAME.find({},{KEY:1})
请注意_id字段始终显示在执行find()方法,如果不想这个字段,那么需要将其设置为0
MongoDB Limit/限制记录
要限制 MongoDB 中的记录,需要使用 limit() 方法。 limit() 方法接受一个数字型的参数,这是要显示的文档数。
limit() 方法的基本语法如下:
>db.COLLECTION_NAME.find().limit(NUMBER)
下面的例子将显示只有2个文档,当执行文档查询。
如果不指定数量 limit() 方法的参数,它会显示从集合中的所有文件。
除了limit() 方法,还有一个方法skip() 也接受数字类型的参数,并使用跳过的文档数。
skip()方法基本语法如下:
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
下面的例子将只显示第二个文档。
请注意,skip()方法的默认值是0
MongoDB 排序文档
要在 MongoDB 中的文档进行排序,需要使用sort()方法。 sort() 方法接受一个文档,其中包含的字段列表连同他们的排序顺序。要指定排序顺序1和-1。 1用于升序排列,而-1用于降序。
sort() 方法的基本语法如下:
>db.COLLECTION_NAME.find().sort({KEY:1})
下面的例子将显示按标题降序排序的文件。
请注意,如果不指定排序优先,则sort() 方法将文档显示为升序排列。
MongoDB 索引
索引支持的解析度的查询效率。如果没有索引,MongoDB 必须扫描每一个文档的集合,要选择那些文档相匹配的查询语句。这种扫描的效率非常低,会要求 mongod 做大数据量的处理。
索引是一种特殊的数据结构,存储设置在一个易于遍历形式的数据的一小部分。索引存储一个特定的字段或一组字段的值,在索引中指定的值的字段排列的。
要创建一个索引,需要使用MongoDB 的ensureIndex()方法。
ensureIndex() 方法的基本语法如下:
db.COLLECTION_NAME.ensureIndex({KEY:1})
这里关键是要在其中创建索引,1是按升序排列的字段名称。要创建降序索引,需要使用-1。
可以通过在多个字段上创建索引。
ensureIndex() 方法也可以接受的选项列表(可选),其下面给出的列表:
| 参数 | 类型 | 描述 |
|---|---|---|
| background | Boolean | 在后台建立索引,以便建立索引并不能阻止其他数据库活动。指定true建立在后台。默认值是 false. |
| unique | Boolean | 创建唯一索引,以便收集不会接受插入索引键或键匹配现有的值存储在索引文档。指定创建唯一索引。默认值是 false. |
| name | string | 索引的名称。如果未指定,MongoDB中都生成一个索引名索引字段的名称和排序顺序串联. |
| dropDups | Boolean | 创建一个唯一索引的字段,可能有重复。 MongoDB的索引只有第一次出现的一个键,从集合中删除的所有文件包含该键的后续出现的。指定创建唯一索引。默认值是 false. |
| sparse | Boolean | 如果为true,指数只引用文档指定的字段。这些索引使用更少的空间,但在某些情况下,特别是各种不同的表现。默认值是 false. |
| expireAfterSeconds | integer | 指定一个值,以秒为TTL控制多久MongoDB的文档保留在此集合. |
| v | index version | 索引版本号。默认的索引版本取决于mongodb 运行的版本在创建索引时. |
| weights | document | 权重是从1到99999范围内的数,表示该字段的意义,相对于其他的索引字段分数. |
| default_language | string | 对于文本索引时,决定停止词和词干分析器和标记生成规则列表的语言。默认值是 english. |
| language_override | string | 对于文本索引时,指定的名称在文档中包含覆盖默认的语言,语言字段中。默认值是语言。 |
MongoDB 聚合
聚合操作过程中的数据记录和计算结果返回。聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果。在SQL COUNT(*)和group by 相当于MongoDB的聚集。
对于在MongoDB中聚集,应该使用aggregate()方法。
aggregate() 方法的基本语法如下:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
上述使用的情况相当于SQL查询 select age, count(*) from test group by age
在上面的例子中,我们已分组字段 age文档,并在每个的次数age先前的值总和递增。没有聚集表达式列表。
| 表达式 | 描述 | 实例 |
|---|---|---|
| $sum | 总结从集合中的所有文件所定义的值. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
| $avg | 从所有文档集合中所有给定值计算的平均. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
| $min | 获取集合中的所有文件中的相应值最小. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
| $max | 获取集合中的所有文件中的相应值的最大. | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
| $push | 值插入到一个数组生成文档中. | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
| $addToSet | 值插入到一个数组中所得到的文档,但不会创建重复. | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
| $first | 根据分组从源文档中获取的第一个文档。通常情况下,这才有意义,连同以前的一些应用 “$sort”-stage. | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
| $last | 根据分组从源文档中获取最后的文档。通常,这才有意义,连同以前的一些应用 “$sort”-stage. | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
管道概念
可能的阶段聚合框架如下:
- $project: 用于选择从收集的一些具体字段。
- $match: 这是一个滤波操作,因此可以减少量,作为下一阶段的输入给定的文档。
- $group: 如上所讨论的,这不实际的聚合。
- $sort: 文件排序。
- $skip: 与此有可能向前跳过的文件列表中的一个给定的的文档数量。
- $limit: 这限制了的文档数量看一下由从当前位置开始的给定数
- $unwind: 这是用来平仓文档的中使用数组。使用数组时,数据是一种pre-joinded,再次有个别文件,此操作将被取消。因此,这个阶段,数量会增加文件的下一阶段。
MongoDB 复制
复制是跨多个服务器同步数据的过程中。复制提供了冗余和增加数据可用性与不同的数据库服务器上的数据的多个副本,复制保护数据库从一台服务器上的损失。复制也可以让恢复硬件故障和服务中断。额外的数据副本,可以奉献一到灾难恢复,报告,或备份。
为什么要复杂
- 为了让数据安全
- 高(24* 7)数据可用性
- 灾难恢复
- 无停机维护(如备份,索引重建,压实)
- 读缩放(额外的副本读取)
- 副本集对应用程序是透明MongoDB 使用副本集达到复制。副本集是一组 mongod 实例,主机相同的数据集。副本中的一个节点,主节点接收所有的写操作。在所有其他情况下,次要节点,适用于从主操作,以使它们具有相同的数据集。副本集只能有一个主节点。
MongoDB中复制的工作原理
- 副本集是一组中的两个或多个节点(一般至少3个节点是必需的)。
- 在副本中设置一个节点是主节点和剩余节点都是次要的。
- 从主要到次要节点的所有数据复制。
- 自动故障转移或维修的时候,选初级建立,并选出新的主节点。
- 失败的节点恢复后,再加入副本集和作品作为辅助节点。
MongoDB 复制是一个典型的图显示在客户端应用程序总是与主节点和主节点,然后将数据复制到二级节点。
副本集特点
- N个节点的群集
- 任何节点可以是主要的
- 所有的写操作为主要的
- 自动故障转移
- 自动恢复
- 主要的共识选择
设置一个副本集
我们将mongod实例转换成独立的副本集。要转换到副本设置遵循以下步骤:
- 关闭停止已经运行的MongoDB服务器。
现在启动MongoDB服务器通过指定 --replSet 选项。 --replSet 基本语法如下:
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
eg:
mongod --port 27017 --dbpath "D:set upmongodbdata" --replSet rs0
它会启动一个mongod 实例名称rs0 ,端口为27017。启动命令提示符 rs.initiate(),并连接到这个mongod实例。在mongod客户端执行命令rs.initiate()启动一个新的副本集。要检查副本集 的配置执行命令rs.conf()。要检查的状态副本sete执行命令:rs.status()。
将成员添加到副本集
将成员添加到副本集,在多台机器上启动mongod 实例。现在开始一个mongod 客户和发出命令 rs.add().
rs.add()命令的基本语法如下:
>rs.add(HOST_NAME:PORT)
eg.
假设mongod实例的名字是mongod1.net它运行端口为27017。这种情况下,到副本集执行的命令rs.add() 在mongod 客户端。
>rs.add("mongod1.net:27017")
>
可以添加mongod实例副本设置,只有当连接到主节点。要检查是否连接至初级或mongo 客户端不执行命令db.isMaster()。
MongoDB 分片
分片存储在多台机器上的数据记录的过程,它是MongoDB的方法来满足数据增长的需求。一台机器上的大小的数据的增加,可能并不足够来存储数据,也不能提供可接受的读取和写入通过。分片解决问题的水平缩放。通过分片,你添加更多的机器支持数据增长的读取和写入操作需求。
为什么要分片
-
复制所有写转到掌握节点
-
延时敏感的查询还是到主节点
-
单副本集有12个节点的限制
-
内存不能足够大,当活动数据集很大
-
本地磁盘不够大
-
垂直缩放太贵
MongoDB分片
下面给出的图显示了在MongoDB中使用分片分片集群。
在上面给出的图中,有三个主要组成部分,这说明如下:
-
碎片: 碎片被用来存储数据。它们提供了高可用性和数据的一致性。在生产环境中,每个碎片是一个单独的副本集。
-
配置服务器: 配置服务器集群的元数据存储。该数据包含集群的数据碎片的映射。查询路由器使用这个元数据,操作具体的碎片。在生产环境中,有整整3分片集群配置服务器。
-
查询路由: 查询路由基本上是Mongos实例,客户端应用程序界面和直接操作相应的碎片。查询路由过程目标操作的碎片,然后将结果返回到客户端。分片集群可以包含多个查询路由来划分客户端请求负载。客户端发送请求到一个查询路由。一般分片集群有许多查询路由。
MongoDB 备份
MongoDB数据转储
创建备份MongoDB中的数据库,应该使用mongodump命令。此命令将服务器的所有数据转储到转储目录。有许多可供选择,通过它可以限制的数据量或创建备份您的远程服务器。
mongodump命令的基本语法如下:
>mongodump
启动mongod 服务器。假设服务器上运行 mongod localhost 端口为 27017。现在打开一个命令提示符并进入 MongoDB实例的bin目录,然后键入命令 mongodump
该命令将连接到127.0.0.1,端口27017服务器上运行,所有的服务器数据目录 /bin/dump/。该命令的输出如下所示:
mongodump 命令可以使用可用的选项的列表。
此命令将仅备份指定的数据库,在指定的路径
| 语法 | 描述 | 示例 |
|---|---|---|
| mongodump --host HOST_NAME --port PORT_NUMBER | 这条命令,将指定mongod实例备份所有的数据库。 | mongodump --host yiibai.com --port 27017 |
| mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY | mongodump --dbpath /data/db/ --out /data/backup/ | |
| mongodump --collection COLLECTION --db DB_NAME | 此命令将备份指定的数据库唯一指定的集合。 | mongodump --collection mycol --db test |
恢复数据
恢复备份数据使用MongoDB 的 mongorerstore 命令。此命令将恢复所有的数据从备份目录。
mongorestore命令的基本语法:
>mongorestore
浙公网安备 33010602011771号