美文网首页
MongoDB学习笔记

MongoDB学习笔记

作者: 唔代 | 来源:发表于2018-04-26 10:58 被阅读0次

    MongoDB

    基本概念

    数据库

    MongoDB一个数据库包括多个集合,类似于MySQL中一个数据库包含多个表;一个集合包含多个文档,类似于MySQL中一个表包含多条数据

    一个MongoDB可以创建多个数据库

    使用show dbs查看所有数据库的列表

    执行db命令则可以查看当前数据库对象或者集合

    运行use命令可以连接到指定的数据库

    文档

    概念:文档是MongoDB的核心,类似于SQLite中的每一行数据。多个键及其关联的值放在一起就是文档。

    注:在MongoDB中使用一种类json的bson存储数据,bson数据可以理解为在json的基础上添加了一些json中没有的数据类型。

    文档的逻辑关系

    嵌入式
    将另一个文档嵌入为一个文档的一个键值对
    引用式
    将两个文档分开,通过引用文档 _id 字段来建立关系

    集合

    集合就是一组文档的组合,相当于关系数据库中的表,在MongoDB中可以存储不同文档结构的文档。

    元数据

    概念:数据库的信息存储在集合中,他们统一使用系统的命名空间:DBNAME.system.* DBNAME可用db或数据库名替代

    常用元数据

    DBNAME.system.namespaces:列出所有的命名空间
    DBNAME.system.indexes:列出所有索引
    DBNAME.system.profile:列出数据库概要信息
    DBNAME.system.users:列出访问数据库的用户
    DBNAMES.system.sources:列出服务器信息

    基本操作

    数据库

    创建

    use mydb
    如果mydb不存在则创建

    查看

    db
    查看当前连接数据库
    show dbs
    查看所有数据库

    销毁

    db.dropDatabase()

    集合

    创建

    db.createCollection(name,options)
    name

    ####### 集合名

    options

    ####### 初始化参数文档

    ####### capped

    ######## Boolean

    ######### true

    ########## 创建一个固定大小的集合,当条目达到最大的时候,自动覆盖之前的条目

    ########## 同时需要指定参数大小

    ####### autoIndexID

    ######## Boolean

    ######### true

    ########## 在_ id filed.s上自动创建索引

    ######### 默认为false

    ####### size

    ######## 与capped: 1 联合使用

    ######## 指定参数的最大值,单位byte

    ####### max

    ######## 指定最大的文档数

    查看

    show collections

    删除

    db.users.drop()
    删除users集合

    文档

    插入数据

    insert()方式
    如果没有对应的集合会自动创建
    db.users.insert([
    { name:"jam:",
     email : "jam@gmail.com"
    },
    {
        name : "tom",
        email : "tom@gmail.com"
    }
    

    ])

    save()方式
    如果没有对应的集合会自动创建
    db.users.save([
    { name:"jam:",
     email : "jam@gmail.com"
    },
    {
        name : "tom",
        email : "tom@gmail.com"
    }
    

    ])

    Insert和Save的区别
    当主键_id存在时,Insert不做任何处理,Save做update处理
    可以先定义文档,再进行插入操作
    userdoc1=({"user_id":1,"name":"cloud","state":"active","actor":"user","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-12","hour":"10:53 PM"}] })

    db.shiyanlou.insert(userdoc1)

    更新数据

    db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)
    SELECTION_CRITERIA表示查找条件
    UPDATED_DATA表示更新后的数据
    默认update函数只对一个文档进行更新

    如果需要作用于所有文档,则需要加入multi:true

    删除文档

    db.COLLECTION_NAME。remove(DELECTION_CRITERIA)

    数据操作

    导入

    mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --type 文件类型 --upsert --drop 文件名

    导出

    mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 查询条件

    备份

    mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件路径

    恢复

    mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件路径

    数据查询

    查询语句 find()

    db.COLLECTION_NAME.find()

    无参数
    返回所有数据
    db.COLLECTION_NAME.find().pretty()
    使查询输出结果更美观

    比较条件操作符

    $gt
    $lt
    $gte
    $lte

    类型比较操作符

    $type
    1

    ####### 双精度

    2

    ####### 字符串

    3

    ####### 对象

    4

    ####### 数组

    5

    ####### 二进制数据

    7

    ####### 对象ID

    8

    ####### 布尔类型

    9

    ####### 数据

    10

    ####### 空

    11

    ####### 正则表达式

    13

    ####### JS代码

    14

    ####### 符号

    15

    ####### 有作用域的JS代码

    16

    ####### 32位整型数

    17

    ####### 时间戳

    18

    ####### 64位整型数

    255

    ####### Min key

    127

    ####### Max key

    AND和OR

    当find()中同时传入多个键值对时,默认为AND查询
    使用$or关键字
    db.post.find(

    {
    $or: [
    {key1: value1}, {key2:value2}
    ]
    }
    ).pretty()

    可以同时使用AND和$or
    db.post.find({
    "likes": {$gt:10},
    $or: [
        {"by": "shiyanlou"},
        {"title": "MongoDB Overview"}
    ]
    

    }).pretty()

    limit()

    读取指定数量的数据记录
    db.blog.fine().limit(100)

    skip()

    读取时跳过指定数量的数据记录
    db.blog.fine().limit(100).skip(50)

    sort()

    升序 1
    db.blog.fine().limit(100).sort({key:1})
    降序 -1
    db.blog.fine().limit(100).sort({key:-1})

    索引 ensureIndex()

    概念

    索引是特殊的数据结构,存储在一个易于遍历读取的数据集合中,索引是对数据库集合中一个文档或者多个文档的值进行排序的一种结构

    语法

    db.COLLECTION_NAME.ensureIndex({key,1|-1})
    1为升序,-1为降序

    可选参数

    background
    Boolean
    建立索引要不要阻塞其他数据库操作,默认为false
    db.COLLECTION_NAME.ensureIndex({key,1|-1},{background:1})
    unique
    Boolean
    建立的索引是否为唯一,默认为false
    name
    string
    索引的名称,若未指定,系统自动生成
    dropDups
    Boolean
    建立索引时,是否删除重复记录,默认false
    sparse
    Boolean
    对文档不存在的字段数据不启用索引,默认为false
    expireAfterSeconds
    integer
    设置集合生存时间,单位s
    v
    Index version
    索引版本号
    weights
    document
    索引权重值,范围1-99999
    default-language
    string
    默认为英语
    language_override
    string
    默认为language

    聚合 aggregate()

    语法

    db.COLLECTION_NAME.aggregate({

    $match:{x:1},
    {limit:NUM},
    $group:{_id:$age}
    })

    可选参数

    $match
    查询,和find一样
    $limit
    限制显示结果数量
    $skip
    忽略结果数量
    $sort
    排序
    $group
    按照给定的表达式组合结果

    聚合表达式

    $sum
    求和
    $abg
    求平均
    $min和$max
    计算最小和最大
    $push
    在结果文档中插入值到一个数组
    $addToSet
    在结果文档中插入值到一个数组,但不创建副本
    $first
    根据资源文档的排序获取第一个文档数据
    $last
    根据资源文档的排序获取最后一个文档数据

    管道

    概念
    MongoDB的聚合管道将文档在一个管道处理完毕后的结果传递给下一个管道处理。

    管道操作是可以重复的

    表达式
    处理输入文档并输出

    表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其他的文档

    常用操作

    ####### $project

    ######## 修改输入文档的结构

    ######## 可以用来重命名、增加或者删除域,也可以用于创建计算结果以及嵌套文档

    ####### $match

    ######## 用于过滤数据,只输出符合条件的文档

    ####### $limit

    ####### $skip

    ####### $unwind

    ######## 将文档中某一个数组类型字段拆分成多条,每条包含数组中的一个值

    ####### $group

    ######## 将集合中的文档分组,可用于统计结果

    ####### $sort

    ####### $geoNear

    ######## 输出接近某一地理位置的有序文档

    例如

    db.shiyanlou.aggregate([{$match:{user_id:{$gt:0,$lte:2}}},{$group:{_id:"user",count:{$sum:1}}}])

    高级查询与索引

    覆盖索引查询

    所有的查询字段多都是索引的一部分;所有的查询返回字段在同一个索引中

    由于索引存在于RAM中,因而从索引中获取数据要比扫描文档更快

    高级索引

    索引数组字段,在数组中创建索引,需要对数组中的每个字段依次建立索引

    索引子文档字段

    原子操作

    所谓原子操作,就是要么执行成功,要么执行失败

    执行成功完成既定任务,执行失败还原执行前的状态

    常用原子操作命令

    $set
    $unset
    $inc
    $push
    $pushAll
    $pull
    $pop
    $rename
    $bit

    查询分析

    explain()

    提供了查询信息,使用索引及查询统计等
    结果字段解释
    indexOnly

    ####### true表示使用了索引

    cursor

    ####### 因为这个查询使用了索引,MongoDB中索引存储在B树结构中,所以这也是使用了BtreeCursor类型的游标。
    如果没有使用索引,游标的类型是BasicCursor。这个键还会给出所使用的索引的名称,你通过这个名称可以查看当前数据库下系统自动创建的system.indexes集合来得到索引的详细信息。

    n

    ####### 当前查询返回的文档数量

    nscanned/nscannedObjects

    ####### 表明这次查询一共扫描了集合中多少个文档
    我们的目的是让这个数值和返回文档的数量越接近越好

    millis

    ####### 当前查询所需时间

    ####### 单位:毫秒

    indexBounds

    ####### 当前查询具体使用的索引

    hint()

    强迫MongoDB使用一个指定的索引

    在某些情形下会提升性能

    MongoDB.png
    本笔记基于实验楼教程,附链接:
    https://www.shiyanlou.com/courses/12

    相关文章

      网友评论

          本文标题:MongoDB学习笔记

          本文链接:https://www.haomeiwen.com/subject/efsplftx.html