MongoDB系列 | 集合的基本操作

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 1:简介MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富、最像关系数据库的。由于关系型数据库存储对数据之间存在高度的关联,在数据量达到上万亿比特时,关系型数据库所特有的约束和关联就会成为性能瓶颈。非关系型数据库采用了另一种思维方式,即不考虑数据之间千丝万缕的联系,存储也不需要固定的模式,这样无需多余的操作就能成倍地扩展数据量。MongoDB 支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型,比如:

1:简介

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富、最像关系数据库的。

由于关系型数据库存储对数据之间存在高度的关联,在数据量达到上万亿比特时,关系型数据库所特有的约束和关联就会成为性能瓶颈。非关系型数据库采用了另一种思维方式,即不考虑数据之间千丝万缕的联系,存储也不需要固定的模式,这样无需多余的操作就能成倍地扩展数据量。

MongoDB 支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型,比如:

{
title: '上周实验学习报告',
body: '上周我们学习了 MongoDB 的知识',
by: 'shiyanlou',
}
如上是一个基本的文档形式,它存储了一封邮件的简易信息,从这里也可以看出 MongoDB 的‘松散’,它和关系型数据库不同,一个集合里面可以有不同格式的文档,而关系型数据库的每一条记录都拥有相同的字段。

1.1 面向集合的存储
在 MongoDB 中,一个数据库包含多个集合,类似于 MySQL 中一个数据库包含多个表;一个集合包含多个文档,类似于 MySQL 中一个表包含多条数据。

可以把集合记为表,文档记为一条记录。

这样命名是有原因的,因为 MongoDB 没有行列统一的表格式排列,而是采用一个大仓库的形式将所有数据包纳其中。文档也一样,它是一段自由独立的数据,受外部限制少,所以区别于关系型数据库的记录。

1.2虚拟机开机配置
启动 MongoDB 服务,因为 MongoDB 并不随系统一起启动,可能以下命令运行后会等一小段的时间才会启动完毕。

sudo service mongodb start
进入 MongoDB 命令行操作界面(可能会出现 connect failed,多试几次就行),

在命令行中敲 exit 可以退出。

mongo
实验中的布尔类型的 ture 用 1 代替,false 用 0 代替。

2:基本概念

2.1 数据库
一个 MongoDB 可以创建多个数据库
使用 show dbs 可以查看所有数据库的列表
执行 db 命令则可以查看当前数据库对象或者集合
运行 use 命令可以连接到指定的数据库
$ mongo # 进入到mongo命令行

use test # 连接到test数据库
注意:数据库名可以是任何字符,但是不能有空格、点号和 $ 字符。

2.2 文档
文档是 MongoDB 的核心,类似于 SQLite 数据库(关系数据库)中的每一行数据。多个键及其关联的值放在一起就是文档。在 Mongodb 中使用一种类 json 的 bson 存储数据,bson 数据可以理解为在 json 的基础上添加了一些 json 中没有的数据类型。

例如:

{"company":"Chenshi keji"}
2.3 文档的逻辑联系
假设有两个文档:

user文档

{
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991"
}

address文档

{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "chengdu",
"state": "sichuan"
}
关系 1:嵌入式关系:把 address 文档嵌入到 user 文档中

这就是嵌入式的关系

{
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991",
"address":
[{
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "chengdu",
"state": "sichuan"
},
{
"building": "170 A, Acropolis Apt",
"pincode": 456789,
"city": "beijing",
"state": "beijing"
}]
}
关系 2:引用式关系:将两个文档分开,通过引用文档的_id 字段来建立关系

这就是引用式关系

{
"name": "Tom Benzamin",
"contact": "987654321",
"dob": "01-01-1991",
"address_ids": [

  ObjectId("52ffc4a5d85242602e000000")    #对应address文档的id字段

]
}
在实际应用的时候,嵌入式关系比较适合一对一的关系,引用式关系比较适合一对多或者多对多的情况。

2.4 集合
集合就是一组文档的组合,就相当于是关系数据库中的表,在 MongoDB 中可以存储不同的文档结构的文档。

例如:

{"company":"Chenshi keji"} {"people":"man","name":"peter"}
上面两个文档就可以存储在同一个集合中,在关系型数据库中是很难实现上述数据结构的,要么需要定义大量的字段,对于一些字段名不确定的属性,关系型数据库会更加力不从心。

MongoDB 的做法也不是完美的。比如在存储用户信息的时候,用户名和密码分别用 username 和 password 字段表示。关系型数据库只需要把字段名作为表结构的一部分保存起来就可以了,而 MongoDB 需要将这两个字段名存储多次,每一条记录都会存储一次字段名,富贵在一些原本就比较碎片化的字段上,用于存储字段名所耗费的空间甚至会超过存储数值的空间,比较好的解决办法是采用尽可能短的字段名,不过这又涉及到了可读性的问题,需要大家在二者之间进行权衡。

2.5 元数据
数据库的信息存储在集合中,他们统一使用系统的命名空间:DBNAME.system.*。

DBNAME 可用 db 或数据库名替代:

DBNAME.system.namespaces :列出所有名字空间
DBNAME.system.indexs :列出所有索引
DBNAME.system.profile :列出数据库概要信息
DBNAME.system.users :列出访问数据库的用户
DBNAME.system.sources :列出服务器信息

3:数据库的创建和销毁

3.1 创建数据库
启动服务后,进入 MongoDB 命令行操作界面:

mongo
使用 use 命令创建数据库:

use mydb
查看当前连接的数据库:

db
查看所有的数据库:

show dbs
列出的所有数据库中看不到 mydb 或者显示 mydb(empty) ,因为 mydb 为空,里面没有任何东西,MongoDB 不显示或显示 mydb(empty)。

3.2 销毁数据库
使用 db.dropDatabase() 销毁数据库:

use local
switched to db local
db.dropDatabase()
查看所有的数据库:

show dbs
可以发现 local 数据库已经被删除了。

4:集合的创建和销毁

4.1 创建集合
在数据库 mydb 中创建一个集合

use mydb
switched to db mydb
db.createCollection("users")
查看创建的集合:

show collections
4.2 删除集合
删除集合的方法如下:(删除 users 集合)

show collections
db.users.drop()
查看是否删除成功:

show collections

5:向集合中插入数据

5.1 使用 insert()
插入数据时,如果 users 集合没有创建会自动创建。

use mydb
switched to db mydb
db.users.insert([
... { name : "jam",
... email : "jam@qq.com"
... },
... { name : "tom",
... email : "tom@qq.com"
... }
... ])
2.5.2 使用 save()
插入数据时,如果 users 集合没有创建会自动创建。

use mydb2
switched to db mydb2
db.users.save([
... { name : "jam",
... email : "jam@qq.com"
... },
... { name : "tom",
... email : "tom@qq.com"
... }
... ])
insert 和 save 的区别:为了方便记忆,可以先从字面上进行理解,insert 是插入,侧重于新增一个记录的含义;save 是保存,可以保存一个新的记录,也可以保存对一个记录的修改。因此,insert 不能插入一条已经存在的记录,如果已经有了一条记录(以主键为准),insert 操作会报错,而使用 save 指令则会更新原记录。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
JSON NoSQL MongoDB
mongodb基本操作,增删改查,查询,索引,权限机制
mongodb基本操作,增删改查,查询,索引,权限机制
|
21天前
|
NoSQL MongoDB 数据库
MongoDB 删除集合
10月更文挑战第14天
25 1
|
8天前
|
缓存 NoSQL MongoDB
|
22天前
|
存储 NoSQL MongoDB
MongoDB 创建集合
10月更文挑战第13天
27 1
|
3月前
|
存储 NoSQL 数据管理
揭秘MongoDB时间序列集合:这个超级功能将如何彻底改变你的数据管理?
【8月更文挑战第8天】时间序列数据记录随时间变化的信息,在数据库管理中至关重要。MongoDB自4.0版起引入时间序列集合,专为这类数据优化存储与查询。通过问答形式介绍其特点:自动数据过期、高效存储机制及快速查询操作。创建时需指定时间字段及可选元数据字段。支持设置数据过期时间,采用粗粒度索引减少I/O操作。查询时可通过时间范围筛选数据,并利用聚合框架进行数据分析。随着实时分析需求的增长,时间序列集合的应用将更加广泛。
156 0
|
5月前
|
NoSQL 安全 MongoDB
精准数据清理:掌握 MongoDB 删除集合的方法与最佳实践
精准数据清理:掌握 MongoDB 删除集合的方法与最佳实践
179 0
|
5月前
|
存储 NoSQL MongoDB
MongoDB 集合创建指南:命名规范、索引优化和数据模型设计
MongoDB 集合创建指南:命名规范、索引优化和数据模型设计
104 0
|
6月前
|
JSON NoSQL MongoDB
MongoDB【CRUD基本操作】
MongoDB【CRUD基本操作】
|
NoSQL MongoDB 数据库
04 MongoDB - 集合操作
04 MongoDB - 集合操作
54 0
|
存储 JSON NoSQL
02 MongoDB - 基本操作
02 MongoDB - 基本操作
24 0