集合是MongoDB中组织数据的基本单位,类似于关系型数据库中的表。本课将深入讲解集合的创建、管理和操作。
在MongoDB中,集合具有以下重要特性:
MongoDB支持两种创建集合的方式:显式创建和隐式创建。
// 基本集合创建
db.createCollection("users")
// 创建集合时指定选项
db.createCollection("products", {
capped: true, // 固定大小集合
size: 10485760, // 10MB大小限制
max: 5000, // 最多5000个文档
autoIndexId: true // 自动创建_id索引(默认true)
})
// 创建验证规则的集合
db.createCollection("orders", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["orderNumber", "customerId", "totalAmount"],
properties: {
orderNumber: { bsonType: "string" },
totalAmount: { bsonType: "decimal" }
}
}
}
})
// 当插入文档时,如果集合不存在会自动创建
db.logs.insertOne({
message: "系统启动",
level: "info",
timestamp: new Date()
})
// 验证集合是否创建
show collections // logs集合会出现在列表中
两种创建方式各有适用场景:
// 创建上限集合示例
db.createCollection("system_logs", {
capped: true,
size: 10485760, // 10MB
max: 10000 // 最多10000个文档
})
// 上限集合特性:
// 1. 固定大小,达到限制时自动删除旧文档
// 2. 保持插入顺序,支持高效的顺序读取
// 3. 不支持文档删除和更新(除非更新后文档大小不变)
// 4. 适合日志、缓存等场景
$、空字符等特殊字符users而非user// insertOne() - 插入单个文档
db.users.insertOne({
name: "李四",
age: 28,
email: "lisi@example.com",
hobbies: ["读书", "旅游"],
address: {
city: "北京",
district: "朝阳区"
},
createdAt: new Date()
})
// 返回结果包含插入的_id
{
acknowledged: true,
insertedId: ObjectId("507f1f77bcf86cd799439011")
}
// insertMany() - 插入多个文档
db.users.insertMany([
{
name: "王五",
age: 30,
email: "wangwu@example.com"
},
{
name: "赵六",
age: 25,
email: "zhaoliu@example.com"
},
{
name: "孙七",
age: 35,
email: "sunqi@example.com"
}
])
// 返回所有插入的_id
{
acknowledged: true,
insertedIds: {
'0': ObjectId("..."),
'1': ObjectId("..."),
'2': ObjectId("...")
}
}
// 手动指定_id
db.users.insertOne({
_id: "user001",
name: "自定义ID用户",
age: 22
})
// ObjectId结构(12字节)
// 4字节时间戳 + 5字节随机值 + 3字节递增计数器
// ordered: false - 无序插入(遇到错误继续插入)
db.users.insertMany([
{ _id: 1, name: "用户1" },
{ _id: 2, name: "用户2" },
{ _id: 1, name: "重复ID" }, // 会失败
{ _id: 3, name: "用户3" } // 仍会插入
], { ordered: false })
// ordered: true(默认)- 有序插入(遇到错误停止)
db.users.insertMany([
{ _id: 4, name: "用户4" },
{ _id: 5, name: "用户5" },
{ _id: 4, name: "重复ID" }, // 会失败
{ _id: 6, name: "用户6" } // 不会插入
], { ordered: true })
// 查看集合统计信息
db.users.stats()
// 查看集合中的文档数量
db.users.countDocuments()
// 查看集合的存储大小
db.users.storageSize()
// 查看集合的索引
db.users.getIndexes()
// 重命名集合
db.users.renameCollection("customers")
// 验证
show collections
// 删除集合及其所有文档
db.users.drop()
// 返回true表示删除成功
true
drop()会删除集合及其所有索引,操作不可逆!
// 创建博客系统的集合
use blog
// 插入文章
db.posts.insertMany([
{
title: "MongoDB入门教程",
author: "张三",
content: "这是一篇关于MongoDB的教程...",
tags: ["数据库", "NoSQL", "MongoDB"],
views: 0,
likes: 0,
createdAt: new Date()
},
{
title: "Node.js最佳实践",
author: "李四",
content: "分享Node.js开发经验...",
tags: ["Node.js", "JavaScript"],
views: 0,
likes: 0,
createdAt: new Date()
}
])
// 插入评论
db.comments.insertOne({
postId: ObjectId("..."), // 文章ID
author: "王五",
content: "写得很好!",
createdAt: new Date()
})
// 查看所有集合
show collections