筑基期
1. 什么是 MongoDB?它与传统关系型数据库有何不同?
MongoDB 是一个开源的、面向文档的 NoSQL
数据库,它以 JSON 风格的 BSON(Binary JSON)
格式存储数据,能够处理大规模的非结构化数据。
与传统的关系型数据库(如 MySQL
、PostgreSQL
)相比,MongoDB
的主要区别在于:
文档存储:
MongoDB
使用文档而非表格结构,数据被存储为键值对,适合存储复杂的、非结构化数据。无固定模式:
MongoDB
不需要预定义数据表的结构(即无固定模式),可以灵活地在同一个集合中存储结构不同的文档。横向扩展:
MongoDB
通过分片实现水平扩展,适合大数据量和分布式系统。内置支持的副本集:
MongoDB
原生支持数据的高可用性,通过复制集来保障数据的冗余备份。
2. MongoDB 中的文档(Document)和集合(Collection)是什么?
在 MongoDB 中
,文档 是基本的存储单元,类似于关系型数据库中的行。
每个文档由多个键值对组成,数据存储格式为 BSON
(类似于 JSON
)。
集合 是一组相关联的文档,类似于关系型数据库中的表。
集合中的文档可以具有不同的字段或数据类型,这使得 MongoDB
灵活且适合存储非结构化数据。
示例文档
{
"name": "Alice",
"age": 30,
"skills": ["Java", "MongoDB"]
}
集合 可以存储多个类似的文档。
3. 如何在 MongoDB 中创建数据库和集合?
MongoDB
不需要显式创建数据库和集合。当第一次在数据库中插入数据时,MongoDB
会自动创建相应的数据库和集合。
创建数据库
在 MongoDB
中,切换数据库的命令会自动创建该数据库:
use my_database
创建集合
MongoDB
不要求显式创建集合,向集合插入文档时,MongoDB
会自动创建该集合。
db.my_collection.insert({ name: "Alice", age: 30 })
如果 my_collection
之前不存在,MongoDB
会在第一次插入文档时创建该集合。
4. MongoDB 中有哪些常见的数据类型?
String:字符串类型,常用于存储文本。
Number:
- Integer:整数类型,可以是
32
位或64
位。 - Double:双精度浮点数。
- Integer:整数类型,可以是
Boolean:布尔类型,用于表示
true
或false
。Date:日期类型,MongoDB 使用
ISODate()
存储日期。Array:数组类型,用于存储多个值。
Object:嵌套文档,存储复杂的数据结构。
ObjectId:每个文档的唯一
ID
,默认_id
字段是一个ObjectId
。
示例文档:
{
"_id": ObjectId("5f50c31e7c34d2e48c8514f4"),
"name": "Bob",
"age": 25,
"is_active": true,
"created_at": ISODate("2023-01-01T12:00:00Z")
}
5. 如何在 MongoDB 中插入、查询、更新和删除文档?
插入文档
db.users.insert({ name: "Alice", age: 30 })
在 users
集合中插入一个新文档。
查询文档
db.users.find({ name: "Alice" })
查询 users
集合中 name
为 "Alice"
的文档。
更新文档
db.users.update({ name: "Alice" }, { $set: { age: 31 } })
将 name
为 "Alice"
的文档中的 age
更新为 31
。
删除文档
db.users.remove({ name: "Alice" })
删除 users
集合中 name
为 "Alice"
的文档。
6. 什么是 MongoDB 的索引?如何创建和使用索引?
索引 是 MongoDB
提高查询性能的关键机制。通过为集合字段创建索引,MongoDB
可以加快查询速度,类似于关系型数据库中的索引。
创建索引
db.users.createIndex({ name: 1 })
为 users
集合中的 name
字段创建升序索引。1
表示升序,-1
表示降序。
使用索引的好处
索引能加速查询操作,尤其是在大规模数据集合上。
对常用的查询字段创建索引,可以显著提高性能。
查询使用索引
db.users.find({ name: "Alice" }).explain("executionStats")
使用 explain()
命令查看查询是否使用了索引。
7. 如何在 MongoDB 中查询数组字段中的数据?
MongoDB
提供了对数组的强大支持,可以直接查询数组字段中的元素。
查询数组字段中的元素
db.users.find({ skills: "MongoDB" })
查询 users
集合中 skills
数组字段包含 "MongoDB"
的文档。
查询数组中的特定元素位置
db.users.find({ "skills.0": "Java" })
查询 users
集合中,skills
数组第一个元素为 "Java"
的文档。
查询数组中多个条件
db.users.find({ skills: { $all: ["Java", "MongoDB"] } })
查询 skills
数组中同时包含 "Java"
和 "MongoDB"
的文档。