MongoDB初识

  • 官方网站 [安装](Install MongoDB Community Edition — MongoDB Manual)

  • mongodb是一个基于文档的强大、灵活、易于扩展的通用型数据库。是基于分布式文件存储的数据库。其由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。它是一种非关系型数据库,这也就意味着它不像mysql这些关系型数据库一样有着外键约束(一个表中的键值可以关联另一张表)等功能, 更加的自由高效

特点:

  1. 数据文件存储格式为 BSONJSON 的扩展,可以认为是二进制的json)。{“name”:“joe”}这是 BSON 的例子,其中"name"是键,"joe"是值。键值对组成了 BSON 格式。
  2. 面向集合存储,易于存储对象类型和 JSON 形式的数据。所谓集合(collection)有点类似一张表格,区别在于集合没有固定的表头。
  3. 模式自由。一个集合中可以存储一个键值对的文档,也可以存储多个键值对的文档,还可以存储键不一样的文档,而且在生产环境下可以轻松增减字段而不影响现有程序的运行。
  4. 支持动态查询。mongodb 支持丰富的查询表达式,查询语句使用 JSON 形式作为参数,可以很方便地查询内嵌文档和对象数组。
  5. 完整的索引支持。文档内嵌对象和数组都可以创建索引。
  6. 支持复制和故障恢复。mongodb数据库从节点可以复制主节点的数据,主节点所有对数据的操作都会同步到从节点,从节点的数据和主节点的数据是完全一样的,以作备份。当主节点发生故障之后,从节点可以升级为主节点,也可以通过从节点对故障的主节点进行数据恢复。
  7. 二进制数据存储。mongodb使用传统高效的二进制数据存储方式,可以将图片文件甚至视频转换成二进制的数据存储到数据库中。
  8. 自动分片。自动分片功能支持水平的数据库集群,可动态添加机器。分片的功能实现海量数据的分布式存
  9. 支持多种语言。支持 C++、 C#、 Erlang、Haskell、JavaScript、Java、Perl、PHP、Python、Ruby、Scala 等开发语言。
  10. mongodb使用的是内存映射存储引擎。mongodb会把磁盘 IO 操作转换成内存操作,如果是读操作,内存中的数据起到缓存的作用;如果是写操作,内存还可以把随机的写操作转换成顺序的写操作,总之可以大幅度提升性能。这也是mongodb快的原因。坏处是没有办法很方便地控制 mongodb占多大内存,mongodb会占用所有能用的内存,所以最好不要把别的服务和mongodb放在同一台服务器部署。
  11. 这里再提示一下,批量数据处理中,数据库的读写吞吐量与实时性大概是负相关的。
    这里注意一下与redis的区别。redis存储的是键值对,本身没有办法分析数据;mongodb相当于一个大数组,本身提供了一些处理功能,如后面提到的聚合。很多复杂的查询只能通过聚合实现,这样的话redis就做不了了。

关系型数据库和非关系型数据库的对比

image
image
image

安装与启动:

  1. 安装(这里使用的是免安装版本)

获取连接 提取码: 30s4

  1. 启动
# 启动数据库服务端(指定数据保存文件夹)
.\mongod.exe --dbpath=`文件路径`
# 启动服务端(没有使用数据可视化,纯命令行操作)
.\Mongo.exe

image

image
image

命令行操作

1. 查看常用的指令(help), 查看当前数据库名称(db), 查看当前中的数据库(show dbs)

help
ab
show dbs # 一般显示默认的三个,要想看到自己创建的需要有数据才行

image

2. 创建数据库

# 切入(或创建) test 数据库,此时触发 test 数据库的创建工作
use lam_test
# 创建集合并插入一条数据(x:1)
db.myCollection.insertOne( { x: 1 } );

image

3. 删除数据库

# 删除代码执行前最好是进入该数据库后执行  use <database>
db.dropDatabase()

image

4. 创建数据库集合(相当于mysql中的创建表)

# 创建的集合名称 选项
db.createCollection(name, options)

参数说明:

  • name: 要创建的集合名称
  • options: (可选)参数的集合

options 可以是如下参数:

参数名 类型 描述
capped 布尔 (可选)如果为 true,则创建最大容量的集合,如果超出容量capped集合将自动的覆盖旧数据,当设置为true时,则需要指定size参数大小进行设置
autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。【3.4版本开始移除该参数详见[SERVER-19067] Warn at creation that autoIndexId:false is deprecated - MongoDB Jira
size 数值 (可选)为固定集合指定一个最大值,即字节数。
如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。
  • [注]在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查max字段。
# 例子展示: 
# 1. 创建一个集合
db.createCollection("user")
# 2. 创建一个带有options操作的集合:
db.createCollection("news", { capped : true, size : 6142800, max : 10000 } )
# 3. 直接插入数据,这会自动创建一个集合(相当于js中的对象操作)
db.score.insert({"math" : "100"})

# 查看数据库中的集合(指定集合)
show collections # 查看当前数据库中所有的集合
db.score.find() # 查看对应集合中的所有数据
db.score.find({"name":"张三"}) # 查看对应集合中符合对应条件的数据

# 删除对应的集合(相当于删除表)
db.<对应的集合名>.drop()

image

5.操作集合

新增数据

# 1. 使用insert(documents)方法 常用,可以单个插入也可以多个插入
#单个插入
db.user.insert({"name":"张三","age":18})

#多个插入
db.user.insert([{"name":"李四","age":18},{"name":"王五"}])

# 2. insertOne(document)方法 只能单个插入
db.user.insertOne({"name":"老六","age":18})

# 3. insertMany(documents)方法 可以多个插入
db.user.insertMany([{"name":"老七","age":18},{"name":"老八"}])

image

修改数据

# 1. 使用update方法,切记要结合$set来使用,否则会将你输入的数据完全覆盖掉源数据
db.user.update({"name":"王五"},{$set:{age:"20"}})
# 在user集合中查找出name为王五的数据并将其age属性修改为20

# 2. 若是数据为数值型,还可以使用$inc,即增加或减少
db.user.update({"name":"王五"},{$inc:{age:-10}}) # 数据减少10

image

删除数据

db.user.remove({'name':'老八'})

image

查找数据

  1. 查询过滤器
# 使用查询过滤器从集合中检索文档。查询过滤器是一组键值对,可按字段值查询文档。
db.user.find({"name":"张三"}) # 查询出name属性为张三的数据
  1. 范围查询操作符
# 范围查询操作符可用于构建基于值范围的查询过滤器。
# 1. lt、lte、g t 、 gt、gt、gte:分别表示less than、less than or equal、greater than、greater than or equal。
# 2. $in:匹配数组中任一值
# 3. $nin:匹配不在数组中的任何值
db.user.find({"age":{"$gt":20,"$lt":30}})
# 查询出user中age属性大于20却小于30的数据
  1. 正则表达式
# 可以使用正则表达式查询字符串字段的值。使用$regex操作符指定正则表达式
db.user.find({"name": {"$regex" : /A/}})
db.user.find({"name": /A/})
# 查询出user集合中name属性存在A的数据
  1. 投影操作
# 可以使用投影操作从文档中选择需要的字段。
db.user.find({},{"name":1,"age":1,"_id":0})
# 查询所有文档,但只返回name和address字段。_id字段默认返回,需要显式排除。
  1. 排序操作
# 可以使用$sort操作对结果进行排序。
db.user.find().sort({"age":1}) # 正序
db.user.find().sort({"age":-1})# 倒序
# 查询user集合中的所有数据根据正反序列出
  1. 限制结果数量以及跳过结果数量(分页查询)
# 可以使用$limit操作限制结果数量和$skip操作跳过结果数量
db.col.find().limit(5) # 限制结果5条数据
db.col.find().skip(10).limit(5) # 跳过前面10条数据,查询后面的5条数据
  1. 获取统计数量
db.user.count({"age":18,"name":"张三"}) #统计结果数量,查询name:张三且age为18的数据条数
  1. pretty()方法以易读的方式查看查询结果
db.user.find().pretty()

数据可视化操作

image