zoukankan      html  css  js  c++  java
  • MongoDB入门上

    MongoDB基本概念

    1.文档是MongoDB中数据的基本单元,类似于关系型数据库的行(但比行复杂的多)

    2.集合可以看成没有模式的表

    3.MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限

    4.MongoDB自带简洁但功能强大的javascript shell,这个工具对于管理MongoDB实例和操作数据非常有用

    5.每一个文档都有一个特殊的键"_id",它在文档所处的集合中是唯一的.

    详细介绍:

    a)文档

    文档是MongoDB的核心概念.多个键及其关联的值有序的放置在一起便是文档.

    大多数语言都有想通的一种数据结构,比如:映射,散列或字典.在javascript里面,文档表示为对象:

    {"greeting":"Hello world","age":30}

    这个文档只有一个键"greeting",其对应的值为"Hello world".绝大数情况下,文档会比这复杂的多,

    经常会包含多个键值对:

    {"greeting":"Hello world","Hello":"Refactor"}

    文档中的键值对是有序的,上面的文档与下面的文档是不同的:

    {"Hello":"Refactor","greeting":"Hello world"}

    文档中的值可以是字符串,也可以是其他几种数据类型.如例子中的"age"的值是整数

    文档中的键是字符串,除了少数例外的情况下,键可以是任意utf-8字符

    键不能含有\0(空字符),这个字符表示键的结尾

    .和$只有在特定的环境下才能使用,使用不当的话,驱动程序会提示

    下划线"_"开头的键是保留的,虽然这个并不是严格要求的

    MongoDB不但区分类型,也区分大小写,下面两个文档是不同的:

    {"age":"30"}

    {"age":30}

    一下文档也是不同的:

    {"age":30}

    {"Age":30}

    MongoDB文档不能有重复键

    {"Hello":"Hello world","Hello":"Refactor"}这是不正确的

    b)集合

    集合是一组文档,如果说文档相当于关系型数据库中的行,那么集合相当于表

    集合是无模式的,这意味着一个集合里面的文档可以是各种各样的,下面两个文档可以存在同一个集合中:

    {"Hello":"Refactor"}

    {"Age":30}

    注意,上面的文档不光是值的类型不同(字符串和整数),他们的键也是不一样的.因为集合里面可以放置任何文档,

    那么就有一个问题:还有必要使用多个集合吗?要是没必要对各种文档划分模式,那么为什么还要使用多个结合呢?

    理由如下:

    1.把各种各样的文档都混在一个集合里面,开发者要么确保每次查询只返回需要的文档种类,要么让执行查询的

    应用程序来处理所有不同类型的文档.如:查询博客文章,还要剔除那么包含有作者数据的文档

    2.在一个集合里面查询特定类型的文档在速度上不划算,分开做多个集合要快的多.如:集合里面有个标注类型的键

    要查询其值为"Refactor1","Refactor2"或"Refactor3"的文档,就会很慢,如果按照名字分割成3个集合的话,查询会

    快的多(参见"子集合")

    3.把同种类型的文档放在一个集合里,这样数据很集中.从只含有博客文章的集合里面查询几篇文章,会比从含有文章

    和作者数据的集合里面查几篇文章少消耗磁盘寻道操作.

    4.当创建索引的时候,文档会有附加的结构(尤其是有唯一索引的时候).索引是按照集合来定义的.把同种类型的文档

    放在同一个集合里面.使索引更有效.

    集合名为满足下列条件的utf-8字符串

    1.集合名不能是空字符串""

    2.集合名不能含有\0空字符,这个字符表示集合名的结尾

    3.集合名不能以"system."开头,这是为系统集合保留的前缀.如:system.users这个集合保存着数据库的用户信息

    system.namespaces集合保存着所有数据库集合的信息.

    4.集合名不能包含保留字符"$"

    子集合

    组织集合的一种惯例是使用"."字符分开的按命名空间划分的子集合.如:一个带有博客功能的应用可能包含两个集合,

    分别是blog.posts和blog.authors.这样做的目的是为了使组织结构更好些,也就是说blog这个集合(可能根本就不存在)

    及其子集合没有任何关系.

    很多MongoDB工具中都包含子集合

    1.GridFS是一种存储大文件的协议,使用子集合来存储文件的元数据,这样就与内容块分开了

    2.MongoDB的web控制台通过子集合的方式将数据组织在DBTOP部分

    3.数据库shell里面,db.blog代表blog集合,db.blog.posts代表blog.posts集合

    在MongoDB中使用子集合是组织数据的最好方法.

    c)数据库

    MongoDB中多个文档组成集合,同样多个集合组成数据库.一个MongoDB实例可以有多个数据库,

    它们之间可视为完全独立的.每个数据库都有独立的权限控制,即便是在磁盘上,不同的数据库也放置

    在不同的文件中.将一个应用的所有数据存储在同一个数据库中.

    和集合一样,数据库也通过名字来标识,数据库名必须满足如下条件的utf-8字符:

    1.不能是空字符串("")

    2.不能含有''(空格),.,$,/,\和\0(空字符)

    3.应全部小写

    4.最多64字节

    之所以有这么限制,是因为数据库名最终会变成文件系统里的文件.

    有些数据库名是保留的,可以直接访问这些有特殊作用的数据库,如:

    1.admin

    从权限的角度看,这是"root"数据库.要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限.

    一些特定的服务器端命令也只能从这个数据库运行,如:列出所有的数据库或者关闭服务器

    2.local

    这个数据库不会被复制,可以用来存储限于本地单台服务器的任意集合

    3.config

    当MongoDB用于分片设置时,config数据库在内部使用,用于保存分片的相关信息.

    把数据库的名字放在集合名前,得到就是集合的完全限定名,称为命名空间.如:如果在cms数据库中

    使用blog.posts集合,那么这个集合的命名空间就是cms.blog.posts.命名空间不得超过121字节,

    在实际应用中应该小于100字节.

    d)MongoDB shell

    MongoDB自带一个javascript shell,可以从命令行与MongoDB实例交互.

    1.运行shell

    shell是功能完备的javascript解释器,可以运行任何javascript程序: 

    2.MongoDB客户端

    shell更重要的用途它是MongoDB客户端.开启的时候,shell会连到MongoDB服务器的test数据库,并将这个

    数据库连接赋值为全局变量db,这个变量是通过shell访问MongoDB的主要入口点.

    shell还有非javascript语法的扩展,这是为了方便SQL shell用户而添加的,如:

    选择要使用的数据库:

    use test

    可以通过db变量来访问其中的集合,如db.users返回当前数据库的users集合.

    在shell中完成,CRUD

    1.新增

    insert函数添加一个文档到集合里面,如:存储一篇博客文章,首先,创建一个局部变量post,内容代表文档的

    javascript对象.

    2.读取

    find会返回集合里面所有的文档,若只想查看一个文档,可以用findOne

    find和findOne可以接受查询文档形式的限定条件,通过条件来查询文档.使用find时,shell自动

    最多显示20个匹配文档

    3.更新

    update 接受两个参数:一个是要更新文档的限定条件,另一个是新的文档.如:向博客中增加评论内容.

    4.删除

    remove从数据库中永久性的删除文档,在不使用参数调用的情况下,它会删除一个集合内的所有文档,它也可以

    接受一个文档作为条件删除.如:

  • 相关阅读:
    python 并发编程 多线程 event
    python 并发编程 多线程 定时器
    python 并发编程 多线程 信号量
    linux top 查看CPU命令
    python 并发编程 多线程 GIL与多线程
    python 并发编程 多线程 死锁现象与递归锁
    python 并发编程 多线程 GIL与Lock
    python GIL全局解释器锁与互斥锁 目录
    python 并发编程 多线程 GIL全局解释器锁基本概念
    执行python程序 出现三部曲
  • 原文地址:https://www.cnblogs.com/refactor/p/2585291.html
Copyright © 2011-2022 走看看