• 自学数据库- MongoDB


    NoSQL

    NoSQL 指的是非关系数据库。NoSQL 使用的最多的就是 key-value 存储,当然还有 xml 等类型。NoSQL 对于传统关系数据库的优点有:

    • 能够提供对数据库高并发的读写
    • 能够满足对海量数据的高效率存储和访问的需求
    • 有较高的可扩展性和可用性

    MongoDB 介绍

    MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 json 的 bjson 格式,因此可以存储比较复杂的数据类型。MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。

    • 面向集合 (Collenction-Orented)
      意思是数据被分组存储在数据集中,被成为一个集合 (Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库里的表 (table),不同的是它不需要定义任何模式 (schema)
    • 模式自由 (schema-free)
      意味着对于存储在 MongoDB 数据库中的文件,我们不需要知道它的任何结构定义。例如,下面两个记录可以存在于同一个集合里面:{'welcome" : “Beijing”} {“age” : 25 }
    • 文档型
      意思是我们存储的数据是键-值对的集合。键是字符串,值可以是数据类型集合里的任意类型,包括数组和文档。这个数据格式称作 “BSON” (Binary Serialized document Notation)

    MongoDB 的下载和安装

    MongoDB 官网
    MongoDB 官方中文文档
    MongoDB 中文网

    MongoDB 是绿色的,官网提供的安装包其实是将一些配置信息在安装阶段运行了。如果使用压缩文件,解压后需要进行配置。

    设置文件

    可以创建一个文本文件,名称任意取。文件中的参数以 " 键 = 值 " 的格式进行存储,例如

    #数据库数据存放目录
    dbpath="D:\MongoDB\db"
    #数据库日志存放目录
    logpath="D:\MongoDB\logs\mongodb.log"
    
    • 1
    • 2
    • 3
    • 4

    主运行文件和简单的运行参数

    文件夹 bin 下的 mongod.exe 为主运行文件,在命令行里输入 mongod.exe -hmongod.exe --help 则能看到参数及说明。

    运行 MongoDB 时,必须添加的参数就是数据库路径了。通常还会添加一个日志文件路径:

    mongod.exe --dbpath ./db --logpath ./logs/mogondb.log
    
    • 1

    执行完成后可以开个浏览器进行测试:在浏览器中输入http://localhost:27017/可看到返回信息:

    It looks like you are trying to access MongoDB over HTTP on the native driver port.

    如果看到这个信息说明程序正常运行。如果需要其他配置可以参考参数说明。

    以本地服务方式运行

    在命令行界面输入以下命令即可安装为服务,记得添加包括数据库路径在内的其他参数。

    mongod.exe --serviceName MongoDB --install
    
    • 1

    安装完成后,可以在服务中看到,也可以手动运行服务 net start MongoDB 或手动停止服务 net stop MongoDB

    如果不需要服务了,则可以进行卸载

    mongod.exe --remove
    
    • 1

    MongoDB 的使用

    MongoDB 与 Sql 的概念对比

    SQLsql说明MongoDBmongodb说明
    database数据库database数据库
    table数据表collection数据集合
    rowdocunent or BSON document文档
    colunmfield字段
    index索引index索引
    primary key主键_id(auto set)id(自动设置)

    MongoDB 数据类型

    类型名称
    Object ID对象ID
    String字符串,最常用,必须是有效的UTF-8
    Boolean布尔
    Integer整数
    Double浮点
    Arrays数组或列表,多个值存储到一个键
    Object用于嵌入式的文档对象,即一个值为一个对象
    Null存储Null值
    Timestamp时间戳
    Date当前日期或时间的UNIX时间格式

    第一次连接到 MongoDB

    在连接之前先要运行 MongoDB,无论是本地服务运行还是命令行运行都行。第一次运行不要加 --auth 即不要进行登录验证。

    运行完 MongoDB 就可以连接到 MongoDB 了。使用 bin 目录下的 mongo.exe 进行连接,如果没有过多的设置直接运行就行了,如果有设置 IP 和端口号,则需要以参数形式传入。

    设置超级管理员账号

    第一次连接上数据库,需要做的就是建立超级管理员账号。

    use admin		// 使用 admin 数据库
    
    db.createUser({
      user: 'admin',    // 用户名(自定义)
      pwd: 'Abc123++',  // 密码(自定义)
      roles:[{
        role: 'root',   // 使用超级用户角色
        db: 'admin'     // 指定数据库
      }]
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    设置完成,可以通过指令 show users 查看是否设置成功。然后关闭 MongoDB 服务程序,以需要验证模式重新部署服务即可使用权限设置了。

    如果忘记了超级管理员账号密码,可以以不需要认证的形式部署服务。这时连接到数据库不需要账号密码,使用 mongo.exe 连接到数据库。

    use admin		// 使用 admin 数据库
    db.system.users.find() 	// 查看当前用户
    db.system.users.remove({})		// 删除现有的用户
    
    db.createUser({user:"admin",pwd:"Admin@123",roles:["root"]})		// 创建超级管理员账号
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后再开启验证重新部署服务就可以了。

    shell 下使用账号登录

    使用 mongo.exe 连接到数据库后

    use admin
    db.auth('admin','Admin@123')
    
    • 1
    • 2

    MongoDB 的操作

    数据库实例的操作

    1. 查看数据库
      列出所有物理上存在的数据库

    show dbs

    1. 切换/创建数据库
      如果数据库不存在,则指向数据库,但不创建。直到插入数据或创建集合时数据库才被创建

    use 数据库名

    1. 删除数据库
      删除当前指向的数据库,如果数据库不存在,则什么也不做

    use 数据库名
    db.dropDatabase()

    集合的操作

    集合相当于 sql 里的表

    1. 创建集合

    db.createCollection(集合名)

    1. 查看集合

    show tables
    show collections

    1. 删除集合

    db.集合名称.drop()

    数据的操作

    首先需要明确的是 MongoDB 中数据是以 文档(document) 形式存在,相当于 sql 里的 row。通常 document 是以字典形式存在。在 MongDB 中,唯一的主键是 _id,它是数据创建时自动生成的(除非主动创建)。另外 MongoDB 是 没有表结构 一说的,上一条数据和下一条数据可以完全没有相同的字段,两个数据可以没有任何关联(除了都有**_id**)。

    1. 新增数据: 新增数据可以使用 insertsave 两种方式,数据以字典或字典列表形式存在。
      insertsave 都可以新增数据,区别在于 insert 不会遍历检测数据,而是直接插入,如果有重复数据则报错。save 会遍历检测数据,有重复数据则更新。

    db.集合名称.insert(document)
    db.集合名称.save(document)
    增加多条数据使用字典列表:
    db.集合名称.insert([{k1:v1},{k2,v2}]

    1. 修改数据:修改数据使用 update 命令,其有3个参数:query 是查询条件,类似 where;update 是更新的数据,类似 set;multi 可选,默认false ,是否更新全部满足条件的文档(false则只更新第一条)
      需注意的是 MongoDB 是全文档更新的,如果参数 update 部分没有的字段,即使原数据有也会丢失。所以通常会将 update 部分增加 $set ,表示只修改更新部分,不修改文档结构。

    db.集合名称.update({query},{update},{multi:false})

    # 只更新找到的第一条数据,且会修改结构,结果
    db.person.update({name:"zs"},{age:16})
    # 只更新第一条数据,不修改文档结构
    db.person.update({name:"zs"},{$set:{age:123}})
    # 更新所有所有符合查询条件的数据
    db.person.update({name:"zs"},{$set:{age:40}},{multi:true})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 删除数据:删除数据使用 remove 命令,其参数为查询条件,如果没有参数则是不进行查询删除全部。

    db.集合名称.remove(查询条件)

    # 删除所有匹配数据
    db.person.remove({name:"zs"})
    # 只删除第一条匹配数据
    db.person.remove({name:"zs"},{justOne:true})
    # 不计条件删除全部
    db.person.remove({})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 查找数据:查找数据使用 findfindOne 命令,区别在于查询全部还是查询第一条符合条件的数据。参数为查询条件,如果没有参数则是查询全部数据。

    db.集合名称.find(查询条件)

    # 查询所有 name 为 zs 的数据
    db.person.find({name:"zs"})
    # 查询所有数据
    db.person.find()
    
    • 1
    • 2
    • 3
    • 4

    查询

    简单查询

    Mongo 支持的运算符有:

    语法操作格式
    $eq等于{key:value}
    $lt小于{key:{$lt:value}}
    $lte小于等于{key:{$lte:value}}
    $gt大于{key:{$gt:value}}
    $gte大于等于{key:{$gte:value}}
    $ne不等于{key:{$ne:value}}
    $or{$or:[{条件1},{条件2}]}
    $and{$and:[{条件1},{条件2}]}
    $not{$not:{条件}}
    $nor或非(非取反){$nor:[{条件1},{条件2}]}
    $exists键是否存在{key:{$exists:true|false}}
    $in在列表中{key:{$in:[value1,value2]}}
    $nin不在列表中{key:{$nin:[value1,value2]}}
    $mod数字模操作{key:{$mod:[num1,num2]}}
    # 查询所有 age 的值 大于16 的数据
    db.person.find({age:{$gt:16}})
    # 查询所有 age 大于等于18 或 name 等于 'zs' 的数据
    db.person.find({$or:[{age:{$gte:18}},{name:"zs"}]})
    
    • 1
    • 2
    • 3
    • 4

    另外还可以根据某一个字段(key)的值的数据类型进行查询,使用 $type,格式为 {key:{$type:数据类型值}}。数据类型和其值可以参考下表

    类型数字备注
    Double1
    String2
    Object3
    Array4
    Binary data5
    Undefined6已废弃
    Object id7
    Boolean8
    Date9
    Null10
    Regular Expression11
    JavaScript13
    Symbol14
    JavaScript (with scope)15
    32-bit integer16
    Timestamp17
    64-bit integer18
    Min key255Query with -1.
    Max key127
    # 这两种方式等价
    db.person.find({name:{$type:2}})
    db.person.find({mame:{$type:'string'}})
    
    • 1
    • 2
    • 3

    模糊查询

    mongo 没有 like ,而是使用正则表达式。使用 // 或 $regex 可以编写正则表达式

    db.person.find({name:/^zs/})
    db.person.find({name:{$regex:'^zs'}})
    
    • 1
    • 2

    自定义查询

    可以使用 $where 后面跟一个函数(JS的语法),则可以返回满足条件的数据

    db.person.find({$where:function(){return this.age>20}})
    
    • 1

    查询结果分页

    可以使用 limit 将查询结果分页处理,用于读取指定数量的文档

    db.集合名称.find(查询条件).limit(NUMBER)

    跳过

    使用 skip 跳过指定数量的文档,即前指定数量的文档在查询结果中不返回

    db.集合名称.find(查询条件).skip(NUMBER)

    排序

    使用 sort 可以对查询结果集按照字段进行排序,参数1为升序0为降序

    db.集合名称.find().sort({key1:1|0,key2:1|0…})

    统计

    使用 count 可以对查询结果集中的文档数据量进行统计

    db.集合名称.find(查询条件).count()

    多级查询

    当某一条数据某一的字段的值是字典时,可以进行使用点进行多级查询例如

    # 文档为: {'name': {'first': 'Joe', 'last': 'Schome'}, 'age': 45}
    # 查询姓名为 Joe Schmoe 的记录,以下2个方法是等价的
    db.person.find({'name.first': 'Joe', 'name.last': 'Schome'})
    db.person.find({'name':{'first': 'Joe', 'last': 'Schome'}})
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    AtCoder Beginner Contest 279 F BOX 并查集 (大意失荆州
    IDEA安装Tomcat
    RabbitMQ、Kafka对比(超详细),Kafka、RabbitMQ、RocketMQ的区别
    哈希散列表hlist_head - linux内核经典实例
    Markdown · Typora | 基本画图技巧
    linux 中的根文件系统
    多线程&并发篇---第九篇
    用递归算法得到Java的树形结构
    Linux系统下centos中在线添加硬盘后不重启在线扩容linux系统目录不重启系统
    完全彻底的卸载MySQL5.7.35
  • 原文地址:https://blog.csdn.net/runsong911/article/details/126301353