• MongoDB


    1.MongoDB 是面向文档的数据库,放弃关系型数据库就是为了获得更加方便的的扩展性。
    2.MongoDB 最初的设计就是考虑到了扩展的文集,使用面向文档的模型使其可以在多台服务器之间分割数据
    平衡集群的负载,自动从排文档。
    3.管理上的方便,管理员只负责启动服务器就行,
    当主服务器挂掉后,MongoDB会自动切换到备份服务器上,并且备份服务器提升为活跃服务器
    在分布式环境下,集群只需要知道有新增加的节点,就会自动继承和配置新节点。
    4.MongoDB的管理理念就是尽可能的让服务器自动配置,让用户在需要的时候调整配置
    5.相关概念
    非关系 关系
    文档——————————————行
    集合--------------表(没有模式)
    mongoDB自带 Javascript shell (可以完成运行javaScript代码的执行),这个工具对于管理MongoDB实例和操作数据作用非常大
    每一个文档都有一个特殊的额键“_id”,文档(行)中所处的集合(表)中式唯一的

    ----------------------------文档----------------------------------
    文档通常--包含多个键值对{“greeting”:"Hello,world!","foo":3}
    文档的键值对是有序的,顺序变的话就是两个不同的文档
    文档的值可以是其他的数据类型,文档的键是一个字符串,也可以是任意UTF-8字符
    键中不能含有(控制符)。这个字符用来表示键的结尾。
    .和$有特殊的意义,通常被保留
    以“_”下划线开头的键是保留的,没有严格的要求
    MonfoDb不但区分类型,也区分大小写

    -----------------------集合-------------------------------------------
    集合(表)是无模式集合里面的文档可以是各式各样的,当相同类型的文档(行)在一个集合里是

    ----------------------------命名-----------------------------------------------------
    集合名不能是空字符串“”
    集合名不能含有字符(空字符),这个字符表示集合名的结尾。
    集合名不能以“system.”开头。这是为系统结合保留 的前缀,如:system.users
    用户创建的集合名不能保留含有保留字符$,千万别在名字里出现$

    ---------------------------子集合---------------------------------------------
    集合与子集合之间可以用. 来表示

    ---------------------------------数据库——----------------------------------------
    实例----》数据库----》集合------》文档
    数据库之间可视为是完全独立的,每个数据库都有独立的权限控制,即便实在硬盘上,不同的数据库也放置在不同文件中。
    在同一个MongoDB服务器上存放多个应用或者用户的数据,就要使用不同的数据库了
    数据库的命名:
    不能是空字符串(“”)
    不得含有‘’(空格),. ,$,/,和(空字符)
    应全部小写
    最多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:MongDBdatadb" --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

  • 相关阅读:
    spring framework体系结构及模块jar依赖关系
    Spring的核心jar包
    Spring AOP的理解和使用
    Spring特点与工作原理
    接口和抽象类的区别
    Java重载和重写的区别
    Jdk1.8中的HashMap实现原理
    Java集合中List,Set以及Map等集合体系详解
    Spring面试题整理
    ActiveMQ入门操作示例
  • 原文地址:https://www.cnblogs.com/qingsheng/p/9567857.html
Copyright © 2020-2023  润新知