阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 集合的创建与删除

集合的创建与删除

作者:陈川 阅读数:46946人阅读 分类: MongoDB

集合的创建

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()
}

删除集合时的注意事项:

  1. 删除操作不可逆,数据将永久丢失
  2. 需要数据库的写权限
  3. 在分片集群中,删除操作会传播到所有分片
  4. 系统集合(如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)

注意事项:

  1. 操作需要源集合的读权限和目标集合的写权限
  2. 在分片集群中不能重命名集合
  3. 重命名操作会保持原始集合的索引和选项

集合选项的修改

创建集合后,可以使用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

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌