MongoDB学习小结

Posted lzyGod的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB学习小结相关的知识,希望对你有一定的参考价值。

启动对应server:cd:到mangodb安装根目录下 mongod --dbpath db路径
创建MangoDB服务:
mongod.exe --logpath d:/mongodb/logs/mongodb.log --logappend --dbpath d:/mongodb/db --directoryperdb --serviceName MongoDB -install
补充一下三个命令:(必须以管理员身份运行cmd,然后执行下面的命令)

启动MongoDB:net start MongoDB
停止MongoDB:net stop MongoDB
删除MongoDB:sc delete MongoDB

创建DataBase
use DATABASE_NAME
use mydb
检查当前选择的数据库
db
检查所有数据库
show dbs

创建集合
createConllection(name,options)
option有以下集中
capped  Boolean (可选)如果为true,则启用封顶集合。封顶集合是固定大小的集合,会自动覆盖最早的条目,当他达到最大大小。如果制定true,则需要也指定尺寸参数。
autoIndexID Boolean (可选)如果true,自动创建索引_id字段的默认值是false。
size   number (可选)指定最大大小字节封顶集合。如果封顶是true,那么必须指定这个字段。
max    number (可选)指定封顶集合允许文件的最大数量。
show Conllections
在MongoDB中,不需要创建集合。当插入一些文件 MongoDB show自动创建的集合。

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 : 此数据类型用于存储正则表达式

插入数据:db.collection.insert() 或者 db.collection.save()
db.mycol.insert({title:‘123‘,name:‘tony‘})
一次插入多行:
db.mycol.insert([{title:‘123‘,name:‘tony‘},{title:‘456‘,name:‘hans‘}])

查询
db.database.find()显示非格式化的数据
db.database.find().pretty()显示格式化的数据
findOne()返回一个文件

RDBMS Where子句和MongoDB等同语句

要查询文件的一些条件的基础上,可以使用下面的操作


操作

语法

例子

RDBMS 等同

Equality {<key>:<value>} db.mycol.find({"by":"tutorials yiibai"}).pretty() where by = ‘tutorials yiibai‘
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()
MongoDB中OR

语法:

OR条件的基础上要查询文件,需要使用$or关键字。OR 基本语法如下所示: 
>db.mycol.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

AND 和 OR 一起使用
下面给出的将显示有像的文件大于100,其标题是“MongoDB Overview‘或者是‘yiibai‘ 。等效于 SQL where子句 为 ‘where likes>10 AND (by = ‘yiibai‘ OR title = ‘MongoDB Overview‘)‘
>db.mycol.find("likes": {$gt:10}, $or: [{"by": "yiibai"}, {"title": "MongoDB Overview"}] }).pretty()

修改语法:
update() 方法的基本语法如下
db.COLLECTION_NAME.update(SELECTIOIN_CRITERIA, UPDATED_DATA)
MongoDB Save() 方法
save() 方法替换现有的文档和通过新的文档 save() 方法
替换时必须保证所有长度一致 否则替换失败

查询对应字段方法:
db.COLLECTION_NAME.find({},{KEY:1})
请注意_id字段始终显示在执行find()方法,如果不想这个字段,那么需要将其设置为0
Limit() 方法 查询几条记录 传入数字
db.COLLECTION_NAME.find().limit(NUMBER)
skip() 跳过几条记录
db.COLLECTION_NAME.find().skip(NUMBER)

sort()方法排序
sort() 方法的基本语法如下 1用于升序排列,-1用于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})


如果不指定排序优先,然后sort() 方法将文档显示在升序排列。
索引支持的解析度的查询效率。如果没有索引,MongoDB 必须扫描每一个文档的集合,要选择那些文档相匹配的查询语句。这种扫描的效率非常低,会要求 mongod 做大数据量的处理。
索引是一种特殊的数据结构,存储设置在一个易于遍历形式的数据的一小部分。索引存储一个特定的字段或一组字段的值,在索引中指定的值的字段排列的。
ensureIndex() 方法创建索引
要创建一个索引,需要使用MongoDB 的ensureIndex()方法。
语法:
ensureIndex() 方法的基本语法如下
db.COLLECTION_NAME.ensureIndex({KEY:1})
db.mycol.ensureIndex({"title":1})
在ensureIndex()方法,可以通过多个字段多个字段上创建索引。
db.mycol.ensureIndex({"title":1,"description":-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 对于文本索引时,指定的名称在文档中包含覆盖默认的语言,语言字段中。默认值是语言。


聚合操作过程中的数据记录和计算结果返回。聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果。在SQL COUNT(*)和group by 相当于MongoDB的聚集。
aggregate() 方法
对于在MongoDB中聚集,应该使用aggregate()方法。
语法:
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 根据分组从源文档中获取的第一个文档。通常情况下,这才有意义,连同以前的一些应用 “$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"}}}])

管道概念

在UNIX 命令 shell 管道是指一些输入和输出作为输入下一个命令等执行操作的可能性。 MongoDB 聚合框架也支持同样的概念。有一组可能的阶段,每个这些的一组文档作为输入,并产生一个结果集的文件(或最终生成的JSON文档在管道末端)。然后又再次被用来为下一阶段等。

可能的阶段聚合框架如下:
$project: 用于选择从收集的一些具体字段。
$match: 这是一个滤波操作,因此可以减少量,作为下一阶段的输入给定的文档。
$group: 如上所讨论的,这不实际的聚合。
$sort: 文件排序。
$skip: 与此有可能向前跳过的文件列表中的一个给定的的文档数量。
$limit: 这限制了的文档数量看一下由从当前位置开始的给定数
$unwind: 这是用来平仓文档的中使用数组。使用数组时,数据是一种pre-joinded,再次有个别文件,此操作将被取消。因此,这个阶段,数量会增加文件的下一阶段。

复制是跨多个服务器同步数据的过程中。复制提供了冗余和增加数据可用性与不同的数据库服务器上的数据的多个副本,复制保护数据库从一台服务器上的损失。复制也可以让恢复硬件故障和服务中断。额外的数据副本,可以奉献一??到灾难恢复,报告,或备份。

为什么要复制?
为了让数据安全
高(24*7)数据可用性
灾难恢复
无停机维护(如备份,索引重建,压实)
读缩放(额外的副本读取)
副本集对应用程序是透明

MongoDB中复制的工作原理
MongoDB 使用副本集达到复制。副本集是一组 mongod 实例,主机相同的数据集。副本中的一个节点,主节点接收所有的写操作。在所有其他情况下,次要节点,适用于从主操作,以使它们具有相同的数据集。副本集只能有一个主节点。
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"

例子
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().

假设mongod实例的名字是mongod1.net它运行端口为27017。这种情况下,到副本集执行的命令rs.add() 在mongod 客户端。rs.add("mongod1.net:27017")

可以添加mongod实例副本设置,只有当连接到主节点。要检查是否连接至初级或mongo 客户端不执行命令db.isMaster()。

以上是关于MongoDB学习小结的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB的索引操作

MongoDB的增删改查

MongoDB的权限管理

MongoDB学习

mongodb的基本操作-小结

mongodb学习相关网址