MongoDB_基础知识

一、MongoDB简介

  1. MongoDB扩展功能

    ① 索引
    支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、地理空间索引、全文索引
    ② 聚合
    支持“聚合管道”,能够通过简单的片段创建复杂的聚合,并通过数据库自动优化
    ③ 特殊的集合类型
    支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会话。也支持固定大小的集合,用于保存近期数据,如日志。
    ④ 文件存储
    存储大文件和文件元数据

二、MongoDB基础知识

  1. 文档

    MongoDB中数据的基本单元,类似于关系数据库中的行。每一篇文档必须有一个“_id”键,这个键的值可以是任意类型的,默认是个ObjectId对象。如果插入文档时没有指定“_id”键,系统会自动创建一个。默认格式为:

    时间戳+机器码+PID+计数器
    

    MongoDB是面向文档的数据库,而不是关系型数据库。面向文档的方式可以将文档或数组内嵌进来,用一条记录就可以表示非常复杂的层次关系。

    ① {“greeting”:”Hello,world!”,”foo”:”3”},文档中包含多个键值对,而键值对是有序的。
    ② 文档中的键可以使用任意的UTF-8字符
    ③ 键不能有\0(空字符),这个字符用来表示键的结尾

    . 和 $ 有特别的含义,只有在特定环境下才能使用。
    以下划线”_”开头的键是保留的。
    MongoDB不但区分类型,也区分大小写
    MongoDB的文档中不能有重复的键
    
  2. 集合

    如果文档相当于一行数据,那么集合相当于一张表。

    ① 集合是无模式的,即同一个集合中的文档可以是各式各样的。
    ② 集合名不能是空字符串””,不能含有\0字符(空字符),这个字符表示集合名的结尾
    ③ 集合名不能以”system.”开头,这是为系统集合保留的前缀。
    ④ 用户创建的集合名字不能含有保留字符$。

  3. 数据库

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

    数据库命名规则:
    ① 不能是空字符串(“”)
    ② 不能含有’’(空格)、.、$、/、\和\0(空字符)
    ③ 应全部小写
    ④ 最多64字节
    ⑤ 一些保留的数据库名:admin(root权限的数据库),local这个数据库永远不会被复制,可以用来存放限于本地单台服务器的任意集合,config当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
    ⑤ 把数据库的名字放到集合名前面,得到的就是集合的完全限定名,称为命名空间。命名空间的长度不得超过121个字节,实际使用中应小于100字节。

  4. 基本数据类型

    ·null 表示空值或者不存在的字段 {“x”:null}
    ·布尔 {“x”:true}
    ·32位整数 此类型在shell中不可用,因为JavaScript仅支持64位浮点数,会被自动转化 为64位浮点数
    ·64位整数 此类型在shell中也不可用,会被自动转化为64位浮点数
    ·64位浮点数
    ·字符串 {“x”:”foobar”}
    ·符号 shell不支持这种类型,shell将数据库里的符号类型转换为字符串
    ·对象id 对象id是文档的12字节的唯一ID {“x”:ObjectId()}
    ·日期 日期类型存储的是从标准纪元开始的毫秒数,不存储时区。 {“x”:new Date()}
    ·正则表达式 文档中可以包含正则表达式 {“x”:/foobar/i}
    ·代码 文档中还可以包含JavaScript代码 {“x”:function(){/………/}}
    ·二进制数据 shell中不可用
    ·最大值 BSON包括一个特殊类型,表示可能的最大值。shell中不支持
    ·最小值 BSON包括一个特殊类型,表示可能的最小值。shell中不支持
    ·未定义 文档可使用未定义类型(null和undefined是不同类型) {“x”:undefined}
    ·数组 值的集合或者列表可以表示成数组 {“x”:[“a”,”b”,”c”]}
    ·内嵌文档 文档可以包含别的文档,也可以作为值嵌入到父文档中

  5. _id和ObjectId

    ① ObjectId使”_id”的默认类型,使用12字节的存储空间,12字节按以下方式生成:

    0|1|2|3|4|5|6|7|8|9|10|11|
    时间戳 | 机器|PID| 计数器
    前4个字节是从标准纪元开始的时间戳,单位为秒。这会带来一些有用的属性:
    -时间戳与随后的5各字节组合起来,提供了秒级别的唯一性。
    -由于时间戳在前,这意味着ObjectId大致会按照插入的顺序排列,这对于某些方面很有用,如将其作为索引提高效率。

  6. 基本命令

    ① 启动MongoDB:

    bin/mongd
    

    ·mongod在没有参数的情况下会使用默认的数据目录/data/db,并使用27017端口。如果数据目录不存在或不可写,服务器会启动失败。如果端口被占用,也会启动失败。

    ·MongoDB会启动一个HTTP服务器,监听比主端口号高1000的端口,也就是28017端口

    ·在启动服务器的shell下可以键入Ctrl+C来完全停止mongod的运行

    ② 运行shell:

    bin/mongo 192.168.6.186/speeches   #进入数据库
    

    ·shell在启动时自动连接MongoDB服务器,所以确保在使用shell前启动mongod

    ·shell是功能完备的JavaScript解释器,可以运行任何JavaScript程序。也可以定义和调用JavaScript函数。

    ·开启shell时将连接到MongoDB服务器的test数据库,并将这个数据库连接赋值给全局变量db,这个变量是通过shell访问MongoDB的主要入口点。

    ·shell提供了一些简单的SQL语法,例如选择数据库:use foobar

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

    db #查看当前数据库
    use speeches #切换数据库
    db.speeches.insert(document) #插入一篇文档,需先编辑好document
    db.speeches.find()
    db.speeches.findone() #查询文档
    db.speeches.update({title:’My Blog Post’},newDocument) #更新文档
    db.speeches.remove({title:’My Blog Post’}) #删除文档

  7. 创建、更新和删除文档

    ① 创建
    insert函数添加一个文档到集合里面。首先,创建一个局部变量,如post。然后使用db.blog.insert(post)进行数据插入

    db.blog.insert(post)    // 或者
    db.speeches.insert({‘bar’:’baz’})
    

    批量插入

    db.speeches.batchInsert({‘_id’:0},{‘_id’:1})
    

    插入校验:当前MongoDB消息长度最大是16M,大于4MB的文档不能存入数据库。

    ② 删除文档
    remove()将删除集合中所有的文档,但不会删除集合本身,原有的索引也会被保留。remove函数可以接受一个查询文档作为可选参数,只有符合条件的文档才被删除。删除数据是永久性的,不能撤销也不能恢复。

    db.speeches.remove({‘bar’:’baz’})
    

    若要清除整个集合,直接drop删除集合会更快,但不能有任何限制条件,且整个集合将被删除,所有的索引也将被删除。

    ③ 更新
    update,接受至少两个参数:第一个是要更新文档的限定条件,第二个是新的文档。
    第二步,执行update操作:

    db.blog.update({title:”My Blog Post”},post)
    

    通常文档只会有一部分要更新,可以使用原子性的更新修改器,指定对文档中的某些字段进行更新

    “$set”  用来指定一个字段的值,如果这个字段不存在,则创建它
    “$unset”删除某个字段
    “$inc”  增加已有键的值,或者该键不存在那就创建一个
    “$push” 向已有的数组末尾加入一个元素,要是没有就创建一个新的数组
    “$pop”  从数组任何一端删除元素
    {“$pop”:{“key”:1}}   从数组末尾删除一个元素
    {“$pop”:{“key”:-1}}  从头部删除一个元素
    

    常见错误是查询条件匹配了多个文档,然后更新的时候由于第二个参数的存在就产生重复的”_id”值,数据库会报错,不做任何修改。

    ④ 查询
    用集合的find方法,可以查看集合内容

    db.blog.find()
    

    find返回集合里面的所有文档,findOne返回一个文档。find和findOne可以接受查询文档形式的限定条件。
    查询条件:

    “$lt”、“$lte”、“$gt”、“gte”分别对应<、<=、>、>=
    “$ne”表示不相等
    “$in”用来查询一个键的多个值
    “$or”在多个键中查询任意的给定值
    “$nin”返回与数组中所有条件都不匹配的文档
    “$not”查找与模式不匹配的文档
    

    ·help命令查看帮助,db.help()查看数据库级别命令的帮助,db.foo.help()查看集合的相关帮助,db.listcommands() 显示所有的数据库命令

    游标:
    数据库使用游标返回find的执行结果。使用游标的next方法对结果进行迭代,使用hasnext查看游标中是否有下一条记录。

    限制返回结果的数量:

    >db.speeches.find().limit(3)
    

    跳过几条文档:

    >db.speeches.find().skip(3)
    

    应避免skip略过大量结果,因为要先找到这些被略过的数据之后抛弃,所以会使得查询变得很慢。
    对返回的结果进行排序:

    >db.speeches.find().sort({name:1,age:-1})
    1表示升序,-1表示降序
    

    游标生命周期:
    在服务器端,游标消耗内存和其他资源。游标完成匹配结果的迭代时,会清除自身;如果客户端的游标已经不在作用域内了,驱动程序会向服务器发送一条特别的消息,让其销毁游标;如果一个游标在10分钟内没有使用的话,数据库游标也会自动销毁。
    如果应用中希望游标持续的时间长一些,可以通过immortal函数告知数据库不要让游标超时。如果关闭了游标超时时间,则一定要迭代完所有结果,或者主动将其销毁。否则,游标会一直消耗服务器资源。

    ⑤ 修改器

    使用修改器时,”_id”的值不能改变。(注意:整个文档被替换时是可以改变的)其他键值,包括其他唯一索引的键,都是可以改变的。

    -$set 用来指定一个键的值,如果键不存在,则创建它。
    -$unset 将键完全删除
    ——一定要使用以$开头的修改器来修改键/值对:
    db.coll.update(criteria,{“foo”:”bar”})这样的语句会将整个文档用{“foo”:”bar”}替换掉。
    -$inc 用来增加已有键的值,或在键不存在时创建一个键。$inc只能用于整数、长整数、双精度浮点数。$inc键的值必须为数字。
    -$push 数组修改器 只能用在值为数组的键上。向数组末尾加入一个元素,若键不存在则会创建一个新的数组。如果一个值不在数组里面就把它加进去,可以在查询文档中用$ne来实现。
    -$addToSet 向数组中添加新的值,若原来存在该值则不作添加。$each 可以结合 $addToSet一次添加多个新的值。
    -$pop 删除数组任何一端的一个元素。{$pop : {key : -1}} 删除末尾的一个元素
    -upsert 一种特殊的更新,要是没有文档符合更新条件,就会以这个条件和更新文档为基础创建一个新的文档。
    -save 是一个shell函数,可以在文档不存在时插入,存在时更新。
    -更新多个文档,可以设置update的第四个参数为true,运行getLastError命令可以知道更新了多少文档。
    -findAndModify 返回已更新的文档
    
  8. 写入安全机制
    写入安全机制是一种客户端设置,用于控制写入的安全级别。两种基本的写入安全机制:应答式写入和非应答式写入。应答式写入是默认的方式:数据库会给出响应,告诉你写入操作是否成功执行。非应答式写入不返回任何响应,并且只对最后一个操作进行检查。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值