足够详细的MongoDB教程(1)

 简介

MongoDB是一个开源, 高性能, 无模式的文档型数据库, 当初的设计就是用于简化开发和方便扩展, 是NoSQL数据库产品中的一种.是最 像关系型数据库(MySQL)的非关系型数据库. 它支持的数据结构非常松散, 是一种类似于 JSON 的 格式叫BSON(Binary JSON), 所以它既可以存储比较复杂的数据类型, 又相当的灵活. MongoDB中的记录是一个文档, 它是一个由字段和值对(field:value)组成的数据结构.MongoDB文档类似于JSON对象, 即一个文档认 为就是一个对象.字段的数据类型是字符型, 它的值除了使用基本的一些类型外, 还可以包括其他文档, 普通数组和文档数组.

数据模型

  • MongoDB 数据模型是面向文档的, 所谓文档就是一种类似于 JSON 的结构, 简单理解 MongoDB 这个数据库中存在的是各种各样的 JSON(BSON)
  • 数据库 (database)
    • 数据库是一个仓库, 存储集合 (collection)
  • 集合 (collection)--->对应mysql的表
    • 类似于数组, 在集合中存放文档
  • 文档 (document)----->对应mysql的行记录
    • 文档型数据库的最小单位, 通常情况, 我们存储和操作的内容都是文档
  • 在 MongoDB 中, 数据库和集合都不需要手动创建, 当我们创建文档时, 如果文档所在的集合或者数据库不存在, 则会自动创建数据库或者集合

 作为文档数据库的优点:

  • 文档(即对象)对应于许多编程语言中的内置数据类型。
  • 嵌入式文档和数组减少了对昂贵连接的需求。
  • 动态模式支持流畅的多态性。

可以解决的业务需求 ,即主要特性

  • 三高需求:高并发, 高性能, 高可用
  • High Performance: 对数据库的高并发读写的要求
  • High Storage: 对海量数据的高效率存储和访问的需求
  • High Scalability && High Available: 对数据的高扩展性和高可用性的需求
  • 主要特性

  • 高性能
    • MongoDB 提供高性能的数据持久化

    • 嵌入式数据模型的支持减少了数据库系统上的 I/O 活动
    • 索引支持更快的查询, 并且可以包含来自嵌入式文档和数组的键 (文本索引解决搜索的需求, TTL 索引解决历史数据自动过期的需求, 地理位置索引可以用于构件各种 O2O 应用)
    • mmapv1, wiredtiger, mongorocks (rocksdb) in-memory 等多引擎支持满足各种场景需求
    • Gridfs 解决文件存储需求
  • 高可用

    MongoDB 的复制工具称作副本集 (replica set) 可以提供自动故障转移和数据冗余

  • 高扩展

    水平扩展是其核心功能一部分

    分片将数据分布在一组集群的机器上 (海量数据存储, 服务能力水平扩展)

    MongoDB 支持基于片键创建数据区域, 在一个平衡的集群当中, MongoDB 将一个区域所覆盖的读写只定向到该区域的那些片

  • 其他

    MongoDB支持丰富的查询语言, 支持读和写操作(CRUD), 比如数据聚合, 文本搜索和地理空间查询等. 无模式(动态模式), 灵活的文档模型

 如何解决

  • 具体的应用场景:
    • 社交场景, 使用 MongoDB 存储存储用户信息, 以及用户发表的朋友圈信息, 通过地理位置索引实现附近的人, 地点等功能.
    • 游戏场景, 使用 MongoDB 存储游戏用户信息, 用户的装备, 积分等直接以内嵌文档的形式存储, 方便查询, 高效率存储和访问.
    • 物流场景, 使用 MongoDB 存储订单信息, 订单状态在运送过程中会不断更新, 以 MongoDB 内嵌数组的形式来存储, 一次查询就能将订单所有的变更读取出来.
    • 物联网场景, 使用 MongoDB 存储所有接入的智能设备信息, 以及设备汇报的日志信息, 并对这些信息进行多维度的分析.
    • 视频直播, 使用 MongoDB 存储用户信息, 点赞互动信息等.
  • 这些应用场景中, 数据操作方面的共同点有:
    • 数据量大
    • 写入操作频繁
    • 价值较低的数据, 对事务性要求不高

缺陷与注意事项 

  • 应用不需要事务及复杂 JOIN 支持
  • 新应用, 需求会变, 数据模型无法确定, 想快速迭代开发
  • 应用需要 2000 - 3000 以上的读写QPS(更高也可以)
  • 应用需要 TB 甚至 PB 级别数据存储
  • 应用发展迅速, 需要能快速水平扩展
  • 应用要求存储的数据不丢失
  • 应用需要 99.999% 高可用
  • 应用需要大量的地理位置查询, 文本查询

与ES比较

优点MongoDBElasticsearch
灵活的数据模型支持灵活的数据模型和动态模式,适应频繁变更的数据结构适用于实时搜索和分析需求
强大的查询功能提供丰富的查询语言和功能,包括聚合管道和全文本搜索具有强大的全文本搜索和语义分析功能
水平扩展能力支持水平扩展,可通过分片处理大规模数据集和高并发负载基于分布式架构,具有良好的弹性和扩展性
多种数据类型支持支持文本、数值、日期、地理位置、二进制数据等多种数据类型适用于构建实时搜索和分析应用
缺点MongoDBElasticsearch
内存消耗较高部分数据加载到内存中,对大规模数据集内存消耗较高需要较多的存储空间和网络带宽,特别是处理大规模数据时
不适合复杂事务处理事务处理功能相对较弱,不适合复杂的多文档事务处理配置和使用相对复杂,有一定的学习曲线

数据类型 

数据类型

描述内存占用
String字符串,存储文本数据取决于字符串长度
Integer整数4 字节
Double双精度浮点数8 字节
Boolean布尔值1 字节
ObjectId文档唯一标识符12 字节
Date日期时间8 字节
Array数组,包含多个值取决于元素个数和类型
Embedded Document嵌入式文档,嵌套其他文档或对象取决于文档的大小
Binary二进制数据取决于数据大小
Null空值0 字节
{
  "_id": ObjectId("615e1e7a9a1d890b6e88e2ac"),
  "name": "John Doe",
  "age": 30,
  "isStudent": true,
  "salary": 50000.50,
  "birthDate": ISODate("1990-01-01T00:00:00Z"),
  "hobbies": ["reading", "running", "cooking"],
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "country": "USA"
  },
  "profilePic": BinData(0, "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAK0lEQVQ4T2NkoBAwUqifg/AAGYvZXpB14AmaAAAAASUVORK5CYII="),
  "notes": null
}

MongoDB最新版安装

 直接官网下载msi安装程序,和mysql一样需要配置环境变量。

在下载好的data目录下创建一个db文件夹,并在文件路径下使用以下命令:

mongod --dbpath E:\wuhuanyicheng\apps\MongoDB\data\db

便可开启数据库服务,一般端口号为27017

 

 为方便开启MongoDB,将其注册成服务

  1. 首先在bin同级目录下创建mogo.config文件,文件内容如下
    dppath=E:\wuhuanyicheng\apps\MongoDB\data\db
    logpath=E:\wuhuanyicheng\apps\MongoDB\log\mongo.log
  2. 管理员身份打开dos命令窗口,在bin目录下执行该行命令

    mongod -dbpath "E:\wuhuanyicheng\apps\MongoDB\data\db" -logpath "E:\wuhuanyicheng\apps\MongoDB\log\mongo.log" -install 
    -serviceName "MongoDB
  3. 启动服务:

    net start MongoDB
  4. 关闭服务

    net stop MongoDB

安裝compass 可視化工具

MongoDB Compass Download (GUI) | MongoDB

 基本语法

数据库 (databases) 管理语法

操作语法
查看所有数据库show dbs; 或 show databases;
查看当前数据库db;
切换到某数据库 (若数据库不存在则创建数据库)use <db_name>;
删除当前数据库db.dropDatabase();

集合 (collection) 管理语法

操作语法
查看所有集合show collections;
创建集合db.createCollection("<collection_name>");
删除集合db.<collection_name>.drop()

默认存在的数据库 

数据库名用途
admin管理和监控MongoDB的特权数据库。包括用户管理、角色管理、集群管理,备份和恢复等。
config存储用于支持MongoDB分片功能的配置信息。包括分片键、分片集合、分片节点等。
local当前节点的本地数据库。包括存储复制集状态、操作日志、节点信息等。
test默认的测试数据库。在进行开发和测试时可以使用,用于临时存储数据和进行实Crud

Crud 

操作语法含义示例
创建db.<collection_name>.insertOne(<document>)创建一个新文档db.users.insertOne({name: "John", age: 30})
db.<collection_name>.insertMany([<documents>])创建多个新文档db.users.insertMany([{name: "John", age: 30}, {name: "Jane", age: 25}])
读取db.<collection_name>.find(<query>)查询满足条件的文档db.users.find({age: {$gt: 25}})
db.<collection_name>.findOne(<query>)查询满足条件的第一个文档db.users.findOne({name: "John"})
更新db.<collection_name>.updateOne(<query>, <update>)更新满足条件的第一个文档db.users.updateOne({name: "John"}, {$set: {age: 35}})
db.<collection_name>.updateMany(<query>, <update>)更新满足条件的所有文档db.users.updateMany({name: "John"}, {$set: {age: 35}})
db.<collection_name>.replaceOne(filter, replacement, options)完全替换满足条件的第一个文档,包括其所有字段和值db.users.replaceOne( { age: { $gte: 30 } }, { name: "John", age: 30, country: "UK" })
删除db.<collection_name>.deleteOne(<query>)删除满足条件的第一个文档db.users.deleteOne({name: "John"})
db.<collection_name>.deleteMany(<query>)删除满足条件的所有文档db.users.deleteMany({age: {$gt: 30}})
  • filter:指定查询条件的文档。用于匹配要替换的目标文档。
  • replacement:用于替换目标文档的文档。完全替换目标文档,包括其所有字段和值。
  • options(可选):一个选项对象,用于指定额外的选项,如upsert(如果匹配的文档不存在,则插入一个新文档)和collation(指定排序规则)等。
  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值