半小时入门 MongoDB
半小时入门 MongoDB
1. 简介
1.1 什么是 MongoDB?
MongoDB 官网:MongoDB:开发者数据平台
MongoDB 官方文档:MongoDB 文档
MongoDB 是一个文档型数据库,数据以类似 JSON 的文档形式存储(称为 BSON)。其设计理念是为了应对大数据量、高性能和灵活性需求。
MongoDB 使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的。
- 数据库(Database):存储数据的容器,类似于关系型数据库中的数据库。
- 集合(Collection):数据库中的一个集合,类似于关系型数据库中的表。
- 文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),以 BSON 格式存储。
- 字段(Field):文档中的键值对,类似于关系型数据库中的列(column),可以是 BSON 对象或者数组。
MongoDB 将数据存储为一个文档,数据结构由键值 (key => value) 对组成,文档类似于 JSON 对象,字段值可以包含其他文档,数组及文档数组:

1.2 BSON 文档
详情:BSON 文档
MongoDB 将数据记录存储为 BSON 文档(BSON 是 JSON 文档的二进制表示形式,包含比 JSON 更多的数据类型)。
1.2.1 文档结构
MongoDB 的数据记录,字段名称是字符串,字段的值可以是任何 BSON 数据类型,包括其他文档,数组和文档数组。例如,以下文档包含各种类型的值:
{
_id: ObjectId("5099803df3f4948bd2f98391"),
name: { first: "Alan", last: "Turing" },
birth: new Date('Jun 23, 1912'),
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ],
views : NumberLong(1250000)
}上面的字段具有以下数据类型:
_id保存一个 ObjectId。name包含一个嵌入式文档,其中包含字段first和last。birth和death保留 Date 类型的值。contribs拥有字符串数组。views保存NumberLong_类型的值。
1.2.2 点符号
MongoDB 使用点符号来访问数组的元素和访问嵌入式文档的字段。
数组:
数组的索引位置从零开始。
要使用点符号指定或访问数组元素,请用点号 (.) 将数组名称和索引位置连接,并用引号引起来:
"<array>.<index>"例如,假设文档中包含以下给定字段:
{
...
names: [ "刘备", "关羽", "张飞" ],
...
}要指定 names 数组中的第三个元素,使用点符号 "names.2"。
嵌入式文档:
要使用点符号指定或访问嵌入式文档的字段,请将嵌入式文档名称与点 (.) 和字段名称连接起来,并用引号引起来:
"<embedded document>.<field>"例如,假设文档中包含以下给定字段:
{
...
name: { first: "刘备", last: "张飞" },
contact: { phone: { type: "cell", number: "111-222-3333" } },
...
}要在 name 字段中指定名为 last 的字段,请使用点符号 "name.last"。
要在 contact 字段中指定 phone 文档中的 number,请使用点符号 "contact.phone.number"。
注意
分区字段不能使用包含点 (.) 的字段名称。
1.2.3 BSON 类型
介绍某些常见 BSON 数据类型。
完整列表 在此。
Array
[ <elements> ]其中数组元素如下:
[ <elements> ]- 数组元素使用扩展 JSON。
- 要指定空数组,请省略内容
[ ]。
Binary
{ "$binary":
{
"base64": "<payload>",
"subType": "<t>"
}
}其中的值如下所示:
"<payload>"- Base64 编码(填充为 "=")有效负载字符串。
"<t>"- 对应于 BSON 二进制子类型的一个字符或两个字符的十六进制字符串。有关可用的子类型,请参阅扩展版 bson 文档 http://bsonspec.org/spec.html。
Date
适用于 1970 年至 9999 年(含)之间的日期:
{"$date": {"$numberLong": "<millis>"}}
{"$date": "<ISO-8601 Date/Time Format>"}对于 1970 年之前或 9999 年之后的日期:
{"$date": {"$numberLong": "<millis>"}}其中的值如下所示:
"<millis>"- 作为字符串的 64 位有符号整数。该值表示相对于纪元的毫秒数。
"<ISO-8601 Date/Time Format>"- 以 ISO-8601 互联网日期/时间格式 为字符串的日期。
- 日期/时间的最大时间精度为毫秒:
- 如果小数部分为非零,则小数形式的秒数实际有 3 个小数位。
- 否则,如果秒的小数部分为零,则应省略。
Decimal128
{ "$numberDecimal": "<number>" }其中的值如下所示:
"<number>"- 高精度小数 作为字符串。
Document
{ <content> }其中文档内容如下所示:
<content>- 使用扩展 JSON 的 “名称:值” 对。
- 要指定空文档,请省略内容
{ }。
Double
对于有限数:
{"$numberDouble": "<decimal string>" }对于无限数或 NAN:
{"$numberDouble": <"Infinity"|"-Infinity"|"NaN"> }其中的值如下所示:
"<decimal string>"- 作为字符串的 64 位带符号浮点数。
<non-integer number>- 非整数。整数数字将解析为整数而不是 double。
Int64
{ "$numberLong": "<number>" }其中的值如下所示:
"<number>"- 作为字符串的 64 位有符号整数。
<integer>- 64 位有符号整数。
Int32
{ "$numberInt": "<number>" }其中的值如下所示:
"<number>"- 作为字符串的 32 位有符号整数。
<integer>- 一个 32 位有符号整数。
MaxKey
{ "$maxKey": 1 }MaxKey BSON 数据类型的比较高于所有其他类型。请参阅 比较/排序顺序 以了解有关 BSON 类型的比较顺序的更多信息。
MinKey
{ "$minKey": 1 }MinKey BSON 数据类型的比较值低于所有其他类型。数据类型有关 BSON 类型的比较顺序的更多信息,请参阅 比较/排序顺序。
ObjectId
{ "$oid": "<ObjectId bytes>" }其中的值如下所示:
"<ObjectId bytes>"- 一个 24 个字符大端十六进制字符串,表示对象标识符字节。
Regular Expression
{ "$regularExpression":
{
"pattern": "<regexPattern>",
"options": "<options>"
}
}其中的值如下所示:
"<regexPattern>"- 与正则表达式模式相对应的字符串。字符串可以包含有效的 JSON 字符和非转义双引号 (
") 字符,但不能包含未转义的正斜杠 (/) 字符。
- 与正则表达式模式相对应的字符串。字符串可以包含有效的 JSON 字符和非转义双引号 (
"<options>"- 指定 BSON 正则表达式选项的字符串。必须按字母顺序指定选项。有关受支持选项的信息,请参阅
$options。
- 指定 BSON 正则表达式选项的字符串。必须按字母顺序指定选项。有关受支持选项的信息,请参阅
Timestamp
{"$timestamp": {"t": <t>, "i": <i>}}其中的值如下所示:
<t>- 自纪元以来的秒数的正整数。
<i>- 增量的正整数。
2. 安装
安装有三部分:
MongoDB Server 数据库服务
- 个人开发选择 MongoDB Community Server,下载地址:https://www.mongodb.com/try/download/community
MongoDB Shell 交互式界面
- 允许用户与 MongoDB 数据库进行交互、执行命令和操作数据库。
- 基于 JavaScript,允许用户直接在命令行或者脚本中使用 JavaScript 语言来操作 MongoDB 数据库。
- MongoDB Shell 是 MongoDB 数据库安装包的一部分,因此,安装 MongoDB 数据库也会自动安装 MongoDB Shell。
- MongoDB Shell 下载地址:https://www.mongodb.com/zh-cn/docs/mongodb-shell/install/
MongoDB Compass 图形化工具
- 一款功能强大的 GUI,用于在可视环境中查询、聚合和分析 MongoDB 数据。
- 下载地址:https://www.mongodb.com/try/download/compass
不同系统的安装过程:
3. 数据库操作
1. mongosh
打开一个连接到本地实例的 MongoShell。所有其他命令都需要在 mongosh 中执行。
2. show databases/show dbs
显示当前 MongoDB 实例中的所有数据库。
> show dbs
admin 40.00 KiB
config 72.00 KiB
local 72.00 KiB3. use <dbname>
切换到数据库 <dbname>。
> use test
switched to db test4. db
显示当前使用中的数据库名称。
> db
test5. show collections
显示当前数据库中的所有集合。
6. db.dropDatabase()
删除当前的数据库。
7. exit
退出 mongosh 会话。
4. CRUD 操作
4.1 集合操作
1. db.createCollection()
创建集合。
// 创建集合 users
> db.createCollection("users")
{ "ok": 1 }2. db.collection.renameCollection()
更新集合名。
提示
db.collection.renameCollection() 方法中 collection 为集合,实际使用应替换为具体的集合名。
在 MongoDB 中,不能直接通过命令来重命名集合。
// 将 users 重命名为 newusers
> db.users.renameCollection("newusers")
{ "ok": 1 }3. db.collection.drop()
删除集合。
// 删除集合 newusers
> db.newusers.drop()
true4.2 文档操作
4.2.1 插入
1. db.collection.insertOne()
将单个文档插入集合中。
> db.users.insertOne({name: "张三"})
{
acknowledged: true,
insertedId: ObjectId('67b20c258a44cbcdf240acb5')
}2. db.collection.insertMany()
将多个文档插入到一个集合中。
> db.users.insertMany([{name: "李四"}, {name: "王五"}])
{
acknowledged: true,
insertedIds: {
'0': ObjectId('67b20c598a44cbcdf240acb6'),
'1': ObjectId('67b20c598a44cbcdf240acb7')
}
}4.2.2 查找
1. db.collection.find()
查询所有的文档。
> db.users.find()2. db.collection.find(<filterObject>)
查询所有满足参数对象 <filterObject> 中指定过滤条件的数据。
> db.users.find({name: "张三"})3. db.collection.find(<filterObject>, <selectObject>)
查询所有满足参数对象 <filterObject> 中指定过滤条件的数据,并且只返回 <selectObject> 中指定的字段。
// 1 表示选中,0 表示不选中
> db.users.find({name: "张三"}, {name: 1, email: 1})4. db.collection.findOne()
与 find() 用法相同,找到满足过滤条件的对象,但是只返回第一条。
> db.users.findOne({age: 18})5. db.collection.countDocuments
返回满足条件的记录的数量。
4.2.3 更新
4.2.4 删除
1. db.collection.deleteOne()
删除满足条件的第一个文档。
2. db.collection.deleteMany()
删除满足条件的所有文档。
4.3 范围操作
5. 聚合操作
聚合主要用于处理数据,并返回计算后的结果,比如求和、平均值等。
