MongoDB
Posted 思辨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB相关的知识,希望对你有一定的参考价值。
1.MongoDB 是面向文档的数据库,放弃关系型数据库就是为了获得更加方便的的扩展性。
2.MongoDB 最初的设计就是考虑到了扩展的文集,使用面向文档的模型使其可以在多台服务器之间分割数据
平衡集群的负载,自动从排文档。
3.管理上的方便,管理员只负责启动服务器就行,
当主服务器挂掉后,MongoDB会自动切换到备份服务器上,并且备份服务器提升为活跃服务器
在分布式环境下,集群只需要知道有新增加的节点,就会自动继承和配置新节点。
4.MongoDB的管理理念就是尽可能的让服务器自动配置,让用户在需要的时候调整配置
5.相关概念
非关系 关系
文档——————————————行
集合--------------表(没有模式)
mongoDB自带 javascript shell (可以完成运行javaScript代码的执行),这个工具对于管理MongoDB实例和操作数据作用非常大
每一个文档都有一个特殊的额键“_id”,文档(行)中所处的集合(表)中式唯一的
----------------------------文档----------------------------------
文档通常--包含多个键值对{“greeting”:"Hello,world!","foo":3}
文档的键值对是有序的,顺序变的话就是两个不同的文档
文档的值可以是其他的数据类型,文档的键是一个字符串,也可以是任意UTF-8字符
键中不能含有\\0(控制符)。这个字符用来表示键的结尾。
.和$有特殊的意义,通常被保留
以“_”下划线开头的键是保留的,没有严格的要求
MonfoDb不但区分类型,也区分大小写
-----------------------集合-------------------------------------------
集合(表)是无模式集合里面的文档可以是各式各样的,当相同类型的文档(行)在一个集合里是
----------------------------命名-----------------------------------------------------
集合名不能是空字符串“”
集合名不能含有\\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以“system.”开头。这是为系统结合保留 的前缀,如:system.users
用户创建的集合名不能保留含有保留字符$,千万别在名字里出现$
---------------------------子集合---------------------------------------------
集合与子集合之间可以用. 来表示
---------------------------------数据库——----------------------------------------
实例----》数据库----》集合------》文档
数据库之间可视为是完全独立的,每个数据库都有独立的权限控制,即便实在硬盘上,不同的数据库也放置在不同文件中。
在同一个MongoDB服务器上存放多个应用或者用户的数据,就要使用不同的数据库了
数据库的命名:
不能是空字符串(“”)
不得含有‘’(空格),. ,$,/,\\和\\0(空字符)
应全部小写
最多64个字节
数据库名
最终会变成文件系统里的文件
有些数据库名是直接保留的,可以直接访问这些特殊作用的数据库:
admin "root"数据库,要是在其中添加一个用户,这个用户将自动继承所有的权限,一些服务器端的命令也只能从这个数据库运行
例如列出所有的数据库或者关闭服务器
local 其中的数据永远不会别复制
config 当Mongo用于分片设置是,config数据库在内部使用,用于保存分片的相关信息
把数据库的名字放到集合名前面,得到的就是集合的完全限定名,成为命名空间cms.blog.posts(cms是数据库名,blog.posts集合),长度不得超过121个字节
MongoDB 的默认端口是27017端口
mongod还会启动一个非常基本的HTTP服务器,监听数据比主端口号高1000的端口,也就是28017端口
可以通过访问http://127.0.0.1:28017
在启动服务器的shell下可以键入ctrl-c来完全的停止mongod的运行
shell 会连接到MongoDB服务器的test数据库,并将这个数据库链接赋值给全局变量db,这个变量是通过shell访问MongoDB的主要入口点
创建文档
post ={"title":"my blog post","content":"Here is my blog post","date":new Date()}
{
"title" : "my blog post",
"content" : "Here is my blog post",
"date" : ISODate("2018-08-31T05:15:39.650Z")
}
插入
db.blog.insert(post)
查看
db.blog.find()
只查看一个
db.blog.findOne()
find和findOne可以接受查询文档形式的限定条件(比配查找),使用find查找时,shell自动最多显示20个匹配的文档
更新 update 至少接受两个参数
(1)修改post,增加“comments”键
post.coments=[]
改变标题title,
db.blog.update({title:"my blog post"},post)
#跟新标题为my blog post 的文章
查看
db.blog.find()
删除
db.blog.remove({title:"my blog post"})
MongoDb的文档类似于JSON,在概念上和JavaScript中的对象神似
Json没有日期类型,没法区分浮点数和整数,不会区分32位和64位数字,也没法表示正则或函数等常用类型
文档可以包含别的文档,也可以嵌入到父文档中
数组可以包含不同的数据类型的元素
内嵌文档就是把整个MongoDB文档作为另一个文档中键的一个值
{
“name”:"john doe",
"address":{
"sreet":"Anytown",
"state":"NY"
}
}
MongoDb从最初开始
设计就是作为分布式数据库,处理多个节点是一个核心要求。
“_id”的默认类型是 ObjectiId
ObjectiId 使用12字节的存储空间,每个字节两位16进制数字,是一个24位的字符串。是实际存储数据的两倍长
理念:能从服务器端转移到驱动程序来做的事,就尽量转移,扩展应用层也要比扩展数据库层容易的多,将食物交由客户端来处理,就减轻了数据库扩展的负担
批量插入消息的最大长度是16M
插入文档时,文档的大小不能超过4M
查看doc文档转为BSON的大小(以字节为单位):
Object.bsonsize(doc)
插入原理:
执行插入--->使用的驱动程序会将数据转换成BSON的形式---->数据库解析BSON,检验是否包含“_id”键,且不超过4M,不做别的验证就将文档插入数据库
MongoDB在插入是并不执行代码,所以这块没有诸如攻击的可能
删除文档
db.users.remove() #删除users集合中的所有文档,但不会删除集合本身
db.mailing.list.remove({"opt-out":true}) #删除mailing.list集合中所有“optout”为true的人
删除数据是永久性的,不能撤销也不能恢复。
python中操作小例子(测试速度):
----------------------------------------------------------------------------------------------
#插入
for i in range(100000):
collection.insert({"foo":"bar","baz":i,"z":10-i})
#删除
import time
from pymongo import Connection
db=Connection().foo
collection = db.bar
start = time.time()
collection.remove()
collection.find_one()
total=time.time()-start()
print("%d seconds"% total)
---------------------------------------------------------------------------------------------------
未理解:
如果用db.drop_colection("bar")来代替remove和find_one,只花了.01秒!速度提升相当明显,但是不能有任何限制
更新文档
文档存入数据库以后,就可以使用update方法来修改它。
update有两个参数 一个是查询文档,一个是要做的修改
跟新操作是原子的
{
"_id":ObjectId("14589798799989856655"),
"name":"joe",
"friends":32,
"enemies":2
}
修改后的样子:
{
“id”:Object("14589798799989856655"),
"username":"joe",
"relationships":
{
"friends":32,
"enemies":2
}
}
更新代码:
> var joe = db.users.findOne({"name":"joe"});
> joe.relationships={"friends":joe.friends,"enemies":joe.enemies}
> delete joe.enemies;
> delete joe.name
常见的错误就是查询条件匹配了多个文档
MongoDB中,集合只有在内容插入后才会创建。
MongoDB中,不需要创建集合,当你插入一些文档时,MongoDB会自动创建集合
文档的数据结构和json基本一样,所有存储在集合中的数据都是BSON格式
BSON是一种类json的一种二进制形式的存储格式,简称Binary Json
--------------------------------------------------------------------------------------------------------------------------
客户端从主节点读取数据,在客户端写入数据到主节点,主节点与从节点进行数据交互保证数据的一致性。
副本集特征:
N 个 节点的集群
任何 节点可作为主节点
所有 写入操作都在主节点上
自动 故障转移
自动 恢复
MongoDB的副本集与我们常见的主从有所不同,主从在主机宕机后所有的服务器将停止,而副本集在主机宕机后,副本集
会接管主节点成为主节点,不会出现宕机的情况。
----------例子
mongod --port 27017 --dbpath "F:\\MongDB\\data\\db" --replSet rs0 #启动一个MongoDB实例,其端口号为27017
链接mongod服务器,在客户端使用rs.initiate()来启动一个新的副本集
rs.conf() 来查看副本集的配置
rs.status() 查看副本集的状态
向副本集添加成员(添加副本集的成员,我们需要使用多台服务器来启动mongo服务。进入Mongo客户端,并使用rs.add()方法来添加副本集的成员。)
先启动一个mongo服务,例如:mongod1.net:27017
rs.add("mongod1.net:27017")
附复习地址:
https://www.cnblogs.com/melonjiang/p/5342505.html
以上是关于MongoDB的主要内容,如果未能解决你的问题,请参考以下文章