Not Only SQL (三) - MongoDB Introduce & CRUD (上)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
简介: Not Only SQL (三) - MongoDB Introduce & CRUD (上)

一、MongoDB Introduce

mongoDB是业界最受欢迎的非关系型数据库解决方案之一,是众多公司和开源项目的首要选择;这主要归功于mongoDB的下面这些优点

  • 灵活性
  • 可扩展性
  • 强大的查询语言
  • 优异的性能

MongoDB是什么

首先MongoDB不是传统的关系型数据库,关系型数据库将数据存放在表格中,通过外键建立两张表或者多张表之间的联系,而mongoDB不存储表格,MongoDB是存储文档的非关系型数据库

除了MongoDB还有哪些非关系型数据库?

04f1daea6f55411bb8724f63c49ea17a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

MongoDB数据库的结构

image.png

MongoDB文档支持的格式是JSON的扩展格式,也称之为BSON。同一个集合中的文档可以拥有完全不同的字段,例如描述客户信息的文档和描述账户信息的文档放在一个集合里,这种灵活性也是非关系型数据库的优势

创建并启动MongoDB服务

使用Docker创建并运行MongoDB

docker pull mongo:4
docker images
# 运行一个mongoDB容器,-v表示挂载数据的目录,-d表示后台运行
docker run --name mongoDB -v /mongoDB/data:/data/db -d mongo:4
docker ps
# 查看mongoDB运行日志
docker logs mongoDB
复制代码

Mongo Express是一个基于网络的MongoDB数据库管理界面

docker pull mongo-express
# 运行mongo-express
docker run --link mongoDB:mongo -p 8081:8081 mongo-express
docker ps
复制代码

浏览器输入ip:8081,就可以进行Mongo DB的管理界面

image.png

点击进入local数据库

image.png

点击_id可以查看一条文档记录

image.png

mongo shell是用来操作MongoDB的javascript客户端界面

# 容器中执行mongo命令进入mongo shell, 第二个mongo是进入mongo shell的命令
docker exec -it mongo mongo
复制代码

mongo shell界面如下所示

image.png

支持javascript命令,退出使用exit命令就可以退出mongo shell

二、基本操作

  • Create 创建
  • Read   读取
  • Update 更新
  • Delete 删除

每篇文档都拥有一个专属_id字段即文档主键,具有唯一性,文档主键支持除数组外的所有数据类型

对象主键是MongoDB默认自动生成的文档逐渐,大小为12个字节并且包含了创建的时间,最好使用mongoDB默认生成的对象主键作为文档主键,这样可以避免主键冲突的情况

创建文档

  • db..insertOne()
  • db..insertMany()
  • db..insert()
  • db..save()
# 使用test数据库
use test
# 查看数据库中所有的集合
show collections
复制代码

db..insertOne()创建第一个文档

db.<collection>.insertOne(
    <document>,
    {
        wirteConcern:<document>
    }
)
复制代码
  • collection:文档将要写入的集合的名称
  • document:文档本身
  • writeConcern:定义了本次文档创建操作的安全写级别,安全写级别用来判断一次数据库写入操作是否成功,安全级别越高,丢失数据的风险越低,写入操作的延迟也越高,如果不提供writeConcern,MongoDB将使用默认的安全写级别

在命令行中执行文档写入操作

image.png

db..insertOne()返回的也是一个BSON格式的数据

  • acknowledged:true表示安全写级别被启用,这里使用的是默认的安全写级别
  • insertedId:被写入的文档的_id
  • 该命令会自动创建响应的集合
# 查询现在的集合列表
show collections
复制代码

再一次往accounts集合中插入数据

image.png

使用try-catch可以处理插入文档时出现的异常

image.png

WriteError即输出的异常信息的文档,可以看出是由于主键冲突造成的异常。

插入数据时指定主键难免会出现主键冲突的情况,可以使用MongoDB的自动生成文档主键的功能,插入文档时不指定主键_id,MongoDB会使用默认生成主键的功能生成主键并返回

image.png

db..insertMany()创建多个文档

db.<collection>.insertMany(
    # 将多个文档作为数组,使用[]传入
    [<document1>,<document2>,<document3>....]
    {
        wirteConcern: <document>,
        ordered: <boolean>
    }
)
复制代码
  • ordered:决定MongoDB是否按照顺序写入数组中的文档,默认为true。如果设置为false,MongoDB会打乱写入顺序,以便优化操作性能

ed8523bdac39493c8ad39f343ef1e852_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

db..insertMany()返回的insertedIds是一个数组包含了插入文档的主键_id

顺序插入文档时遇到错误

image.png

使用find()命令查看集合中所有的文档,文档全部插入失败

image.png

在顺序写入时,一旦遇到错误,便会退出操作,剩下的文档无论是否正确都不会被写入数据库中

乱序插入文档时遇到错误

image.png

在乱序写入时,即使某些文档写入出现异常,剩余正确的文档仍然会被写入数据库 查看数据库中的数据

image.png

乱序写入出现异常时,name为strange1的文档仍然被写入数据库

db..insert()创建一个或多个文档

db.<collection>.insert(
    # 将多个文档作为数组,使用[]传入
    <document> or [<document1>,<document2>,<document3>....]
    {
        wirteConcern: <document>,
        ordered: <boolean>
    }
)
复制代码

使用db..insert()命令插入一个或者多个文档

image.png

db..insert()出现异常时同样可以使用try-catch输出异常信息

插入文档总结

三个命令的不同点

  • insertOne、insertMany和insert插入成功的返回和异常返回的格式不同
  • insertOne和insertMany命令不支持db..explain()命令,insert()支持

db..save()命令也可以创建一个或者多个文档,它是调用db..insert()来完成创建的

默认的文档主键是ObjectId,里面包含了创建时间,可以通过调用getTimestamp()方法获取

image.png

当主键也是一个文档时,该主键称为复合主键。复合主键仍然要满足文档主键的唯一性。


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
2月前
|
SQL DataWorks NoSQL
DataWorks产品使用合集之如何将SQL Server中的数据转存到MongoDB
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
261 1
|
21天前
|
SQL NoSQL API
MongoDB 增删改查 常用sql总结
MongoDB 增删改查 常用sql总结
19 1
|
3月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之报错显示“Unsupported SQL query! sqlUpdate() only accepts SQL statements of type INSERT and DELETE"是什么意思
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
104 0
|
3月前
|
SQL 资源调度 NoSQL
实时计算 Flink版产品使用合集之使用Flink CDC SQL MongoDB Connector时,可以采取什么措施来提升数据消费速率
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
存储 SQL NoSQL
第3期 MongoDB与SQL存储
第3期 MongoDB与SQL存储
84 0
|
3月前
|
SQL XML Java
MyBatis Plus通用CRUD与条件构造器使用及SQL自动注入原理分析
MyBatis Plus通用CRUD与条件构造器使用及SQL自动注入原理分析
193 0
|
3月前
|
NoSQL Java 关系型数据库
让 MongoDB 的 CRUD 有 JPA 的味道
让 MongoDB 的 CRUD 有 JPA 的味道
50 0
|
3月前
|
NoSQL 关系型数据库 MySQL
使用 MongoTemplate 对 MongoDB 进行 CRUD
使用 MongoTemplate 对 MongoDB 进行 CRUD
68 0
|
3月前
|
NoSQL JavaScript 前端开发
MongoDB【CRUD练习-条件查询-文档关系】
MongoDB【CRUD练习-条件查询-文档关系】
|
SQL 缓存 NoSQL
MongoDB-SQL优化
本文主要讲述了MongoDB的SQL优化相关的几个知识点:1)查询优化器原理;2)执行计划解析;3)性能排查手段;4)读写优化
4341 0

热门文章

最新文章