MongoDB 基本介绍和操作(中)

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: MongoDB 基本介绍和操作(中)

8、mongodb 排序

MongoDB sort()方法


在MongoDB中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的

字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。


语法
 

sort()方法基本语法如下所示:

db.COLLECTION_NAME.find().sort({KEY:1})

9、mongodb 索引

MongoDB使用 ensureIndex() 方法来创建索引。

语法  

ensureIndex()方法基本语法格式如下所示:  

db.COLLECTION_NAME.ensureIndex({KEY:1})


实例:

ensureIndex() 方法中你也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)。

db.col.ensureIndex({"title":1,"description":-1})

ensureIndex() 接收可选参数,可选参数列表如下:

参数 类型 描述
background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false
unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDups Boolean 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

10、mongodb 聚合

aggregate() 方法的基本语法格式如下所示:


db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

表达式 描述 实例
$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 根据资源文档的排序获取第一个文档数据。 db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last 根据资源文档的排序获取最后一个文档数据 db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

管道的概念

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。

管道操作是可以重复的。

表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,

不能处理其它的文档。


这里我们介绍一下聚合框架中常用的几个操作:

$project:修改输入文档的结构。可以用来重命名、增加或删除域,

                       也可以用于创建计算结果以及嵌套文档。

 

$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。

 

$limit:用来限制MongoDB聚合管道返回的文档数。


$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。


$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。


$group:将集合中的文档分组,可用于统计结果。


$sort:将输入文档排序后输出。


$geoNear:输出接近某一地理位置的有序文档。

11、mongodb 复制(副本集)

MongoDB复制原理


mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是


从节点,负责复制主节点上的数据。


mongodb各个节点常见的搭配方式为:一主一从、一主多从。


主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据


               副本执行这些操作,从而保证从节点的数据与主节点一致。


MongoDB复制结构图如下所示:

MongoDB副本集设置


1、关闭正在运行的MongoDB服务器。


现在我们通过指定 --replSet 选项来启动mongoDB。--replSet 基本语法格式如下:


mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet


"REPLICA_SET_INSTANCE_NAME"


实例


mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0


以上实例会启动一个名为rs0的MongoDB实例,其端口号为27017。


副本集添加成员


rs.add(HOST_NAME:PORT)


实例:


rs.add("mongod1.net:27017")

12、mongodb 分片

分片

在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。

当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的

读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理

更多的数据。

为什么使用分片

(1)复制所有的写入操作到主节点

(2)延迟的敏感数据会在主节点查询

(3)单个副本集限制在12个节点

(4)当请求量巨大时会出现内存不足。

(5)本地磁盘不足

(6)垂直扩展价格昂贵

 

MongoDB分片

上图中主要有如下所述三个主要组件:

Shard:

    用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个

    relica set     承担,防止主机单点故障

Config Server:

     mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。

Query Routers:

    前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

分片实例

分片结构端口分布如下:

Shard Server 1:27020

Shard Server 2:27021

Config Server :27100

Route Process:40000


步骤一:启动Shard Server

[root@100 /]# mkdir -p /www/mongoDB/shard/s0

[root@100 /]# mkdir -p /www/mongoDB/shard/s1

[root@100 /]# mkdir -p /www/mongoDB/shard/log

[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27020 --dbpath=

                                /www/mongoDB/shard/s0 --logpath=/www/mongoDB/shard/log/s0.log

                               --logappend --fork


步骤二: 启动Config Server

[root@100 /]# mkdir -p /www/mongoDB/shard/config

[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27100 --dbpath=

                               /www/mongoDB/shard/config --logpath=/www/mongoDB/shard/log/config.log

                               --logappend --fork


步骤三: 启动Route Process

                     /usr/local/mongoDB/bin/mongos --port 40000 --configdb localhost:27100 --fork

                     --logpath=/www/mongoDB/shard/log/route.log --chunkSize 500

步骤四: 配置Sharding


接下来,我们使用MongoDB Shell登录到mongos,添加Shard节点


[root@100 shard]# /usr/local/mongoDB/bin/mongo admin --port 40000

MongoDB shell version: 2.0.7

connecting to: 127.0.0.1:40000/admin

mongos> db.runCommand({ addshard:"localhost:27020" })

{ "shardAdded" : "shard0000", "ok" : 1 }

......

mongos> db.runCommand({ addshard:"localhost:27029" })

{ "shardAdded" : "shard0009", "ok" : 1 }

mongos> db.runCommand({ enablesharding:"test" }) #设置分片存储的数据库

{ "ok" : 1 }

mongos> db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})

{ "collectionsharded" : "test.log", "ok" : 1 }


步骤五: 程序代码内无需太大更改,直接按照连接普通的mongo数据库那样,


将数据库连接接入接口40000

13、mongodb 备份与恢复

语法

mongodump命令脚本语法如下:

>mongodump -h dbhost -d dbname -o dbdirectory


-h:

MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017


-d:

需要备份的数据库实例,例如:test


-o:

备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,


系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。


mongodump 命令可选参数列表如下所示:

语法 描述 实例
mongodump --host HOST_NAME --port PORT_NUMBER 该命令将备份所有MongoDB数据 mongodump --host runoob.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数据恢复


mongodb使用 mongorerstore 命令来恢复备份的数据。


语法

mongorestore命令脚本语法如下:

>mongorestore -h dbhost -d dbname --directoryperdb dbdirectory


-h:

MongoDB所在服务器地址


-d:

需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2

 

--directoryperdb:

备份数据所在位置,例如:c:\data\dump\test,这里为什么要多加一个test,


而不是备份时候的dump,读者自己查看提示吧!


--drop:

恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,


备份后添加修改的数据都会被删除,慎用哦!

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
4月前
|
NoSQL JavaScript 前端开发
如何使用 Node.js 连接和操作 MongoDB 数据库?
如何使用 Node.js 连接和操作 MongoDB 数据库?
237 2
|
3月前
|
NoSQL MongoDB Python
深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析
使用 sort() 方法对结果进行升序或降序排序。 sort() 方法接受一个参数用于“字段名”,一个参数用于“方向”(升序是默认方向)。
68 0
|
25天前
|
缓存 NoSQL 关系型数据库
【MongoDB】MongoDB更新操作时是否立刻fsync到磁盘?
【4月更文挑战第2天】【MongoDB】MongoDB更新操作时是否立刻fsync到磁盘?
|
26天前
|
消息中间件 NoSQL Kafka
云原生最佳实践系列 5:基于函数计算 FC 实现阿里云 Kafka 消息内容控制 MongoDB DML 操作
该方案描述了一个大数据ETL流程,其中阿里云Kafka消息根据内容触发函数计算(FC)函数,执行针对MongoDB的增、删、改操作。
|
3月前
|
机器学习/深度学习 自然语言处理 NoSQL
|
3月前
|
存储 NoSQL MongoDB
Python小姿势 - Python操作MongoDB数据库
Python小姿势 - Python操作MongoDB数据库
|
6月前
|
NoSQL API MongoDB
Python使用PyMongo4.x操作MongoDB总结
PyMongo是一个Python编程语言中用于连接和操作MongoDB数据库的库。它提供了丰富的功能和API,使开发者能够在Python中轻松地进行MongoDB的数据交互和管理。
84 2
|
7月前
|
NoSQL JavaScript Java
MongoDB 入门教程系列之三:使用 Restful API 操作 MongoDB
MongoDB 入门教程系列之三:使用 Restful API 操作 MongoDB
83 0
|
7月前
|
存储 NoSQL Java
MongoDB 入门教程系列之二:使用 Spring Boot 操作 MongoDB
MongoDB 入门教程系列之二:使用 Spring Boot 操作 MongoDB
99 0
|
7月前
|
SQL NoSQL MongoDB
MongoDB 操作(CRUD) 教程—官方原版
MongoDB 操作(CRUD) 教程—官方原版
113 0