首页 > 数据库技术 > 详细

MongoDB相关操作(2)

时间:2016-03-08 00:30:53      阅读:281      评论:0      收藏:0      [点我收藏+]

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中复制的工作原理

  1. 副本集是一组中的两个或多个节点(一般至少3个节点是必需的)。
  2. 在副本中设置一个节点是主节点和剩余节点都是次要的。
  3. 从主要到次要节点的所有数据复制。
  4. 自动故障转移或维修的时候,选初级建立,并选出新的主节点。
  5. 失败的节点恢复后,再加入副本集和作品作为辅助节点。

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

 

MongoDB相关操作(2)

原文:http://www.cnblogs.com/gimin/p/5248213.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!