半小时入门 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 KiB
3. use <dbname>
切换到数据库 <dbname>
。
> use test
switched to db test
4. db
显示当前使用中的数据库名称。
> db
test
5. 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()
true
4.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. 聚合操作
聚合主要用于处理数据,并返回计算后的结果,比如求和、平均值等。