筑基期
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" 的文档。