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

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
简介: 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
相关文章
|
4月前
|
NoSQL Java MongoDB
Springboot WebFlux项目结合mongodb进行crud
这篇文章介绍了如何使用Spring Boot WebFlux框架结合MongoDB进行基本的CRUD(创建、读取、更新、删除)操作,包括项目设置、实体类和Repository的创建、控制器的实现以及配置文件的编写。
97 0
Springboot WebFlux项目结合mongodb进行crud
|
1月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
50 17
|
2月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
123 9
|
8月前
|
SQL DataWorks NoSQL
DataWorks产品使用合集之如何将SQL Server中的数据转存到MongoDB
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
310 1
|
5月前
|
NoSQL MongoDB 数据库
python3操作MongoDB的crud以及聚合案例,代码可直接运行(python经典编程案例)
这篇文章提供了使用Python操作MongoDB数据库进行CRUD(创建、读取、更新、删除)操作的详细代码示例,以及如何执行聚合查询的案例。
51 6
|
7月前
|
SQL NoSQL API
MongoDB 增删改查 常用sql总结
MongoDB 增删改查 常用sql总结
243 1
|
9月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之报错显示“Unsupported SQL query! sqlUpdate() only accepts SQL statements of type INSERT and DELETE"是什么意思
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
395 0
|
9月前
|
SQL 资源调度 NoSQL
实时计算 Flink版产品使用合集之使用Flink CDC SQL MongoDB Connector时,可以采取什么措施来提升数据消费速率
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
142 0
|
SQL 缓存 NoSQL
MongoDB-SQL优化
本文主要讲述了MongoDB的SQL优化相关的几个知识点:1)查询优化器原理;2)执行计划解析;3)性能排查手段;4)读写优化
4400 0
|
5月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")