🪡MongDB
2022-8-21
| 2023-1-31
0  |  阅读时长 0 分钟
type
status
password
date
slug
summary
category
URL
tags
icon

MongoDB简介

MongoDB 是一个基于分布式文件存储的 NoSQL 数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中的能最丰富,最像关系数据库的
MongoDB 使用 BSON(Binary JSON) 对象来存储,与 JSON 格式的键值对(key/value)类似,字段值可以包含其他文档,数组及文档数组。支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系型数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

与关系数据库的区别

SQL术语概念
MongoDB术语概念
database(数据库)
database(数据库)
table (表)
collection(集合)
row(行)
document or BSON document (文档)
column(列)
field(字段)
index(索引)
index(索引)
table joins(表连接)
embedded documents and linking(嵌入的文档和链接)
primary key primary key Specify any unique column or column combination as primary key.(指定任意唯一的列或列组合作为主键)
primary key primary key in MongoDB, the primary key is automatically set to the _id field.(在MongoDB 中,主键被自动设置为_id字段)
aggregation (e.g. group by)
MongoDB provides three ways to perform aggregation: the aggregation pipeline, the map-reduce function, and single purpose aggregation methods. (聚合操作)

数据类型

数据类型
描述
String
字符串。存储数据常用的数据类型。在MongoDB 中,UTF-8编码的字符申才是合法的。
Integer
整型数值。用于存储数值。根据你所采用的服务器,可分为32位或 64位。
Boolean
布尔值。用于存储布尔值(真/假)。
Double
双精度浮点值。用于存储浮点值。
Min/Max keys
将一个值与 BSON(二进制的JSON) 元素的最低值和最高值相对比。
Arrays
用于将数组或列表或多个值存储为一个键。
Timestamp
时间戳。记录文档修改或添加的具体时间。
Object
用于内嵌文档。
Null
用于创建空值。
Symbol
符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date
日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date对象,传入年月日信息。
Object ID
对象ID,用于创建文档的ID。
Binary Data
二进制数据。用于存储二进制数据。
Code
代码类型。用于在文档中存储 JavaScript代码。
Regular
正则表达式类型。用于存储正则表达式。

用户管理

用户权限

权限
说明
read
允许用户读取指定数据库。
readWrite
允许用户读写指定数据库。
userAdmin
允许用户向 system.users 集合写入,可以在指定数据库里创建、删除和管理用户。
dbAdmin
允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile。
clusterAdmin
必须在 admin 数据库中定义,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase
必须在 admin数据库中定义,赋予用户所有数据库的读权限。
readwriteAnyDatabase
必须在 admin数据库中定义,赋予用户所有数据库的读写权限。
userAdminAnyDatabase
必须在 admin数据库中定义,赋予用户所有数据库的 userAdmin 权限。
dbAdminAnyDatabase
必须在 admin 数据库中定义,赋予用户所有数据库的 dbAdmin权限。
root
必须在 admin数据库中定义,超级账号,超级权限。

创建管理用户

MongoDB 有一个用户管理机制,简单描述为管理用户组,这个组的用户是专门为管理普通用户而设的,暂且称之为管理员。管理员通常没有数据库的读写权限,只有操作用户的权限,我们只需要赋予管理员 userAdminAnyDatabase角色即可。另外管理员账户必须在 admin 数据库下创建。
💡
由于用户被创建在哪个数据库下,就只能在哪个数据库登录,所以把所有的用户都创建在 admin数据库下。这样我们切换数据库时就不需要频繁的进行登录了。 先 use admin 切换至 admin 数据库进行登录,登录后再 use 切换其他数据库进行操作即可。第二次的 use 就不需要再次登录了。MongoDB 设定 use 第二个数据库时如果登录用户权限比较高就可以直接操作第二个数据库,而不需要登录。

创建步骤

  1. 切换数据库:管理员需要在 admin 数据库下创建,所以我们需要先切换至 admin 数据库。
    1. 查看用户:通过 db.system.users.find() 函数查看 admin 数据库中的所有用户信息。
      1. 创建用户:在MongoDB 中可以使用 db.createUser({用户信息})函数创建用户。
          • user:用户名
          • pwd:密码
          • customData:存放用户相关的自定义数据,该属性也可忽略
          • roles:数组类型,配置用户的权限

      创建普通用户

      需求:创建一个 test 数据库,给这个数据库添加一个用户,用户名为 testuser,密码为 123456。并授予该用户对 test数据库的读写操作权限。
      1. 管理员登录数据库
        1. 普通用户需要由管理员用户创建,所以先使用管理员用户登录数据库。
      1. 创建数据库
        1. MongoDB 没有特定创建数据库的语法,在使用 use 切换数据库时,如果对应的数据库不存在则直接创建并切换。
      1. 创建用户
        1. 身份认证
          1. 打开一个新的客户端连接,切换至 test 数据库,执行文档插入语句,返回信息如下:

        更新用户

        更新角色

        如果我们需要对已存在的用户进行角色修改,可以使用 db.updateUser() 函数来更新用户角色。注意:执行该函数需要当前用户具有 userAdminuserAdminAnyDatabseroot 角色。

        更新密码

        使用 db.updateUser(”用户名”,{”pwd”:”新密码”}) 函数更新密码 使用 db.changeUserPassword(”用户名”,”新密码”)函数更新密码

        删除用户

        通过 db.dropUser() 函数可以删除指定用户,删除成功以后会返回 true。删除用户时需要切换到该用户所在的数据库。注意:需要使用具有 userAdmin 或 userAdminAnyDatabse 或 root 角色的用户才可以删除其他用户。

        Database 操作

        命令
        作用
        use
        切换指定数据库。 如果切换的数据库不存在,则创建该数据库。
        db 命令
        显示当前所在的数据库
        show dbs 或者 show databases
        查看所有数据库。 不同角色看见的数据库不一样,管理员能看见所有的数据库,普通用户只能看见自己的数据库。 新创建数据库里面没有数据时通过 show dbs 或 show databases 是无法查看到的。需要向库中新增一个文档才能看见。
        use mydb; db.dropDatabase()
        删除数据库。删除数据库需要切换到需要删除的数据库中,且登录用户具有 dbAdmindbAdminAnyDatabase 或更高权限,执行 db.dropDatabase()

        创建数据库

        在 MongoDB 中创建数据库的命令使用的是 use 命令。该命令有两层含义:
        • 切换指定数据库。
        • 如果切换的数据库不存在,则创建该数据库。

        查询数据库

        • 执行 db 命令可以显示当前所在的数据库。
        • 若想查看所有数据库,可以通过 show dbs 或者 show databases 命令查看。
          • 不同角色看见的数据库不一样,管理员能看见所有的数据库,普通用户只能看见自己的数据库。 新创建数据库里面没有数据时通过 show dbs 或 show databases 是无法查看到的。需要向库中新增一个文档才能看见。

        删除数据库

        删除数据库需要切换到需要删除的数据库中,且登录用户具有 dbAdmindbAdminAnyDatabase 或更高权限,执行 db.dropDatabase()

        Collection 操作

        MongoDB 中的集合是一组文档的集,相当于关系型数据库中的表。
        命令
        描述
        db.createCollection("c1")
        创建集合
        db.c2.insert({"a":1})
        当第一个文档插入时,集合就会被创建并包合该文档 插入文档时如果没有指定 _id 则默认为 ObjectId 类型,_id 不能重复,且在插入后不可变。
        db.c3
        创建一个空集合,里面没有数据时通过 show tables 或 show collections 是无法查看到的。需要向集合中插入一个文档才能看见。
        show tablesshow collections
        查看所有集合
        db.c1.stats()
        查看集合详情。
        db.c1.drop()
        删除集合c1

        创建集合

        MongoDB 使用 db.createCollection() 函数来创建集合。
        • 语法格式:db.createCollection(name, options)。 name:要创建的集合名称。options:可选参数,指定有关内存大小及索引的选项。
          • 字段
            类型
            描述
            capped
            布尔
            (可选)如果为 true,则创建固定集合。固定集合是指有固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
            size
            数值
            (可选)限制集合空间的大小,默认为没有限制(以字节计)。如果 capped 为 true,必须指定该字段。
            autoIndexId
            布尔
            (可选)如果为 true,自动在 _id 字段创建索引。默认为 true。
            max
            数值
            (可选)限制集合中包含文档的最大数量,默认为没有限制。

        查看集合

        通过 show tablesshow collections 查看所有集合。通过 db.COLLECTION_NAME.stats() 查看集合详情。

        删除集合

        通过 db.COLLECTION_NAME.drop() 删除集合。

        Document 操作

        命令
        描述
        db.c2.insert({"a":1})
        当第一个文档插入时,集合就会被创建并包合该文档 插入文档时如果没有指定 _id 则默认为 ObjectId 类型,_id 不能重复,且在插入后不可变。
        db.c1.insertOne({"name":"a"})
        删除集合c1
        db.c1.save({"name" :"a"})
        如果不指定 _id 字段 save() 方法等同于 insert() 方法。如果指定 _id 字段,则变为更新文档的操作。
        批量插入
        1. db.c1.insert([{name:"a"}, {name:"b"}]) 2. db.c1.insertMany([{name:"a"},{name:"b"}]) 3. db.c1.save([{name:"a"}, {name:"b"}])
        db.c1.update(query, update, options)
        更新操作
        db.c1.remove(<query>, {justOne: <boolean>})
        query:(可选)删除的文档的条件。如果没有那么删除所有数据 Justone:(可选)如果设为 true,则只删除一个文档; False删余所有匹配的数据

        插入文档

        单条插入

        可以使用 insert/insertOne/save 插入单条文档:
        1. db.c1.insert({"name":"a"}):插入文档时如果没有指定 _id 则默认为 ObjectId 类型,_id 不能重复,且在插入后不可变。
        1. db.c1.insertOne({"name":"a"})
        1. db.c1.save({"name" :"a"}):如果不指定 _id 字段 save() 方法等同于 insert() 方法。如果指定 _id 字段,则变为更新文档的操作。

        批量插入

        可以使用 insert/insertMany/save 插入多条文档。区别在于把单条插入时函数参数的对象类型{}变成数组类型[{}, {}]
        1. db.c1.insert([{name:"a"}, {name:"b"}])
        1. db.c1.insertMany([{name:"a"},{name:"b"}])
        1. db.c1.save([{name:"a"}, {name:"b"}])

        更新文档

        update、save函数

        通过 update 系列函数或者 save 函数可以更新集合中的文档。我们来详细看下 update 函数的使用,上一节已经介绍过 save 函数。update() 函数用于更新已存在的文档。语法格式如下:
        • query:update 的查询条件,类似 SQL update 语句中的 where 部分。
        • update:update 的对象和一些更新的操作符(如 $set, $inc.) 等,也可以理解为 SQL update 语句中的 set部分。
        • upsert:可选,如果不存在 update 的文档,是否插入该文档。true 为插入,默认是 false,不插入。
        • multi:可选,是否批量更新。true 表示按条件查询出来的多条记录全部更新,false 只更新找到的第一条记录,默认是 false。
        💡
        注意:更新文档是更新整个文档的操作,如果修改的值只有 name 和 age,除了_id 以外其他属性将会被删除。

        更新操作符

        操作符
        作用
        $set
        用来指定—个键并更新键值,若键不存在并创建。
        $inc
        可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。
        $unset
        主要是用来删除键。
        $push
        向文档的某个数组类型的键添加一个数组元素,不过滤重复的数据。添加时键存在,要求键值类型必须是数组;键不存在,则创建数组类型的键。
        $pop
        删除数据元索。1 表示从数组的尾部删除,1 表示从数组的头部删除元素
        $pull
        从数组中删除满足条件的元素
        $pullAll
        从数组中删除满足条件的多个元素
        $rename
        对键进行重新命名。

        删除文档

        通过 remove() 函数是用来移除集合中的数据,其语法格式如下所示:
        • query:(可选)删除的文档的条件。
        • Justone:(可选)如果设为 true,则只删除一个文档,False删余所有匹配的数据

        查询文档

        查询所有

        💡
        如果你需要以易读的方式来读取数据,可以使用 pretty()

        运算

        比较
        逻辑
        MongoDB中字典内用逗号分隔多个条件是and关系,或者直接用 $and, $or,$not (与或非)
        成员
        成员运算无非in和not in, MongoDB中形式为 $in$nin

        $type

        MongoDB中可以使用的类型如下表所示:
        类型
        数字
        备注
        Double
        1
        String
        2
        Object
        3
        Array
        4
        Binary data
        5
        Undefined
        6
        已废弃
        Object id
        7
        Boolean
        8
        Date
        9
        Null
        10
        Regular Expression
        11
        JavaScript
        13
        Symbol
        14
        JavaScript (with scope)
        15
        32-bit integer
        16
        Timestamp
        17
        64-bit integer
        18
        Query with -1
        Min key
        255
        Max key
        127

        正则化

        正则定义在 / /

        投影

        在MongoDB中,当执行 find() 方法,那么它会显示一个文档所有字段。要限制这一点,需要设置的字段列表值1或0。 1用来显示字段而0是用来隐藏字段,_id 会默认显示出来。

        数组

        排序

        在MongoDB中使用使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用1和-1来指定排序的方式,其中1为升序排列,而-1是用于降序排列

        分页

        limit表示取多少个document, skip代表跳过几个document分页公式如下:
        db.user.find().skip( (pageNum-1)*pagesize ).limit(pagesize)

        统计

        聚合

        我们在查询时肯定会用到聚合,在MongoDB中聚合为aggregate,聚合函数主要用到 $match$group , $avg, $project, $concat,可以加 $match 也可以不加 $match
        表达式
        描述
        $sum
        计算总和。
        $avg
        计算平均值
        $min
        获取集合中所有文档对应值得最小值。
        $max
        获取集合中所有文档对应值得最大值。
        $push
        在结果文档中插入值到一个数组中。
        $addToSet
        在结果文档中插入值到一个数组中,但不创建副本
        $first
        根据资源文档的排序获取第一个文档数据。
        $last
        根据资源文档的排序茯取最后一个文档数据
        Aggregate语法
        基本格式:db.collection.aggregate(pipeline, options)
        • pipeline:一系列数据聚合操作或阶段。在版本2.6中更改:该方法仍然可以将流水线阶段作为单独的参数接受,而不是作为数组中的元素;但是,如果不将管道指定为数组,则不能指定options参数。目前所使用的4.0.4版本必须使用数组。
        • options:可选。aggregate()传递给聚合命令的其他选项。2.6版中的新增功能:仅当将管道指定为数组时才可用。
        💡
        注意:使用db.collection.aggregate()直接查询会提示错误,但是传一个空数组如db.collection.aggregate([])则不会报错,且会和find一样返回所有文档。
        $match和$group: 相当于sql语句中的where和group by
        $project
        用于投射,即设定该键值对是否保留。1为保留,0为不保留,可对原有键值对做操作后增加自定义表达式(查询哪些要显示的列)
        $sort和$limit和$skip
        $sample
        随机选取n个:$sample
        $concat和$substr和$toLower和$toUpper

        索引

        创建索引

        索引通常能够极大的提高查询的效率,MongoDB使用 ensurelndex() 方法来创建索引,其基本语法格式如下所示:db.COLLECTION_NAME.ensureIndex({KEY:1})
        • key:创建的索引字段,1为指定按升序创建索引,-1则为按降序来创建索引。
        ensureIndex() 接收可选参数,可选参数列表如下:
        Type
        Description
        background
        Boolean
        建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引。即增加”background”可选参数,background 默认值为faise.
        unique
        Boolean
        建立的索引是否唯一。指定为true创建唯一索引,默认值为false
        name
        string
        索引的名你,如果未指定,MongoDB会通过连接索引的字段名和排序顺序生成一个名称。
        dropDups
        Boolean
        在建立唯一索引时,是否删除重复记录。指定true创建唯一索引,默认值为 false
        sparse
        Boolean
        对文档中不存在的字段数据不启用索引。这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含该字段的文档,默认值为false
        expreAfterSeconds
        integer
        指定一个以秒力单位的数值,完成TTL设定,设定集合的生存时间,
        v
        索引的版本号,默认的索引版本取决于mongod创建索引时运行的版本
        weights
        document
        索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分仅重。
        default_language
        string
        对于文本索引,该字段决定了停用词及词干和词器的规则和列表。默认为英语
        language _override
        string
        对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为language

        查询索引

        查询索引的语法格式如下所示:db.COLLECTION_ NAME.getIndexes()

        删除索引

        删除索引的语法格式如下所示:db.COLLECTION_NAME.droplindex(INDEX_NAME)
      2. nosql
      3. MySQL主从复制Python 函数装饰器
        Loading...
        目录