集合的创建与删除
集合的创建
MongoDB中集合的创建是隐式的,当首次向一个不存在的集合插入文档时,系统会自动创建该集合。这种设计简化了开发流程,但也可以通过createCollection()
方法显式创建集合。
显式创建集合的语法:
db.createCollection(name, options)
常用选项参数:
capped
:布尔值,是否创建固定集合size
:数值,固定集合的最大大小(字节)max
:数值,固定集合允许的最大文档数validator
:文档,验证规则validationLevel
:字符串,验证级别validationAction
:字符串,验证失败时的处理方式
创建普通集合示例:
// 创建普通集合
db.createCollection("products")
// 创建带验证的集合
db.createCollection("employees", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "position"],
properties: {
name: { bsonType: "string" },
position: { bsonType: "string" },
salary: { bsonType: "double" }
}
}
}
})
创建固定集合示例:
// 创建最大100MB、最多1000文档的固定集合
db.createCollection("logs", {
capped: true,
size: 104857600,
max: 1000
})
集合的删除
删除集合使用drop()
方法,这会永久删除集合及其所有文档、索引和关联的元数据。
基本语法:
db.collection.drop()
删除集合示例:
// 删除products集合
db.products.drop()
// 检查集合是否存在后再删除
if(db.getCollectionNames().includes("tempData")) {
db.tempData.drop()
}
删除集合时的注意事项:
- 删除操作不可逆,数据将永久丢失
- 需要数据库的写权限
- 在分片集群中,删除操作会传播到所有分片
- 系统集合(如system.*)通常不能被删除
集合的检查与列举
在操作集合前,通常需要检查集合是否存在或获取数据库中的所有集合列表。
检查集合是否存在:
// 方法一:检查集合名称是否在集合列表中
db.getCollectionNames().includes("users")
// 方法二:使用listCollections命令
db.getCollectionInfos({name: "users"})
获取所有集合列表:
// 获取当前数据库所有集合名称
show collections
// 编程方式获取集合列表
db.getCollectionNames()
// 获取集合详细信息
db.getCollectionInfos()
集合的重命名
使用renameCollection()
方法可以重命名集合,这在重构数据库结构时很有用。
语法:
db.collection.renameCollection(target, dropTarget)
参数说明:
target
:新集合名称dropTarget
:可选,布尔值,如果目标集合存在是否删除
示例:
// 将customers重命名为clients
db.customers.renameCollection("clients")
// 强制重命名,覆盖已存在的目标集合
db.oldData.renameCollection("newData", true)
注意事项:
- 操作需要源集合的读权限和目标集合的写权限
- 在分片集群中不能重命名集合
- 重命名操作会保持原始集合的索引和选项
集合选项的修改
创建集合后,可以使用collMod
命令修改某些集合选项。
常见可修改选项:
- 验证规则(validator)
- 验证级别(validationLevel)
- 验证动作(validationAction)
- 索引选项
示例:
// 修改集合的验证规则
db.runCommand({
collMod: "employees",
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "department"],
properties: {
name: { bsonType: "string" },
department: { bsonType: "string" },
hireDate: { bsonType: "date" }
}
}
},
validationAction: "warn"
})
集合统计信息
获取集合的统计信息有助于了解集合的使用情况和性能特征。
常用统计命令:
// 获取集合基础统计
db.collection.stats()
// 获取集合存储统计
db.collection.storageSize()
// 获取集合总大小
db.collection.totalSize()
// 获取集合索引大小
db.collection.totalIndexSize()
示例输出分析:
const stats = db.orders.stats()
console.log(`集合大小: ${stats.size} 字节`)
console.log(`文档数量: ${stats.count}`)
console.log(`平均文档大小: ${stats.avgObjSize} 字节`)
console.log(`存储大小: ${stats.storageSize} 字节`)
console.log(`索引数量: ${stats.nindexes}`)
集合的克隆与复制
在某些场景下需要复制集合结构或数据到其他集合。
复制集合数据:
// 简单复制所有文档
db.sourceCollection.find().forEach(function(doc) {
db.targetCollection.insert(doc)
})
// 使用aggregate管道处理后再复制
db.sourceCollection.aggregate([...]).forEach(function(doc) {
db.targetCollection.insert(doc)
})
克隆集合(包括索引):
// 克隆集合到同一数据库
db.sourceCollection.aggregate([{ $out: "clonedCollection" }])
// 克隆到其他数据库
db.sourceCollection.aggregate([{ $out: { db: "otherDB", coll: "clonedCollection" } }])
集合的导入导出
MongoDB提供了工具和命令来导入导出集合数据。
使用mongoimport/mongoexport工具:
# 导出集合为JSON
mongoexport --db test --collection products --out products.json
# 从JSON导入集合
mongoimport --db test --collection products --file products.json
使用编程方式导出导入:
// 导出为JSON文件
const fs = require('fs')
const docs = db.products.find().toArray()
fs.writeFileSync('products.json', JSON.stringify(docs))
// 从JSON文件导入
const data = JSON.parse(fs.readFileSync('products.json'))
db.products.insertMany(data)
集合的特殊操作
MongoDB还提供了一些特殊的集合操作命令。
压缩集合(WiredTiger存储引擎):
db.runCommand({ compact: "largeCollection" })
转换集合为固定集合:
db.runCommand({
convertToCapped: "logs",
size: 1048576
})
重建集合(类似SQL的TRUNCATE):
// 方法一:删除后重建
db.tempData.drop()
db.createCollection("tempData")
// 方法二:使用deleteMany删除所有文档
db.tempData.deleteMany({})
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
上一篇:数据库的创建与删除