Skip to content

MongoDB 创建集合

集合是 MongoDB 中文档的容器,类似于关系型数据库中的表,但不需要预定义模式。

创建集合方法

方法一:隐式创建(推荐)

插入文档时自动创建集合:

javascript
use mydb

// 自动创建 users 集合并插入文档
db.users.insertOne({ name: "张三", age: 25 })

// 查看集合列表
show collections

方法二:显式创建

使用 createCollection() 方法:

javascript
db.createCollection("users")

方法三:带选项创建

javascript
db.createCollection("logs", {
  capped: true,           // 固定集合
  size: 5242880,          // 最大大小 5MB
  max: 5000               // 最大文档数
})

集合选项

常用选项

选项类型说明
cappedboolean是否为固定集合
sizenumber固定集合的最大大小(字节)
maxnumber固定集合的最大文档数
validatorobject文档验证规则
validationLevelstring验证级别
validationActionstring验证失败时的动作

创建验证规则集合

javascript
db.createCollection("users", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "email"],
      properties: {
        name: {
          bsonType: "string",
          description: "用户名必填"
        },
        email: {
          bsonType: "string",
          pattern: "^.+@.+$",
          description: "邮箱格式不正确"
        },
        age: {
          bsonType: "int",
          minimum: 0,
          maximum: 150
        }
      }
    }
  },
  validationLevel: "strict",    // strict | moderate
  validationAction: "error"     // error | warn
})

集合命名规则

命名规范

  • 不能为空字符串
  • 不能包含 \0(空字符)
  • 不能以 system. 开头(系统保留)
  • 不能包含 $ 字符
  • 建议小写字母,下划线分隔

有效命名

javascript
db.createCollection("users")           // ✓
db.createCollection("user_profiles")   // ✓
db.createCollection("orders_2024")     // ✓

无效命名

javascript
db.createCollection("")                // ✗ 空字符串
db.createCollection("system.users")    // ✗ 系统保留
db.createCollection("my$collection")   // ✗ 包含$

查看集合

列出所有集合

javascript
show collections

// 或
show tables

// 或
db.getCollectionNames()

获取集合统计

javascript
db.users.stats()

检查集合是否存在

javascript
// 方法1
db.getCollectionNames().indexOf("users") >= 0

// 方法2
db.users.exists() !== null

固定集合(Capped Collection)

特点

  • 固定大小,空间用完循环覆盖
  • 自动维护插入顺序
  • 适合日志、缓存等场景

创建固定集合

javascript
db.createCollection("system_logs", {
  capped: true,
  size: 104857600,    // 100MB
  max: 10000          // 最多10000条
})

查询固定集合

javascript
// 按插入顺序查询
db.system_logs.find().sort({ $natural: 1 })   // 正序
db.system_logs.find().sort({ $natural: -1 })  // 倒序

转换普通集合为固定集合

bash
# 需要导出再导入
mongodump --db mydb --collection logs
mongorestore --db mydb --collection logs_new

# 在 mongosh 中
db.logs.renameCollection("logs_backup")
db.createCollection("logs", { capped: true, size: 10000000 })

集合操作示例

完整示例

javascript
use ecommerce

// 1. 创建用户集合
db.createCollection("users", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["username", "email"],
      properties: {
        username: { bsonType: "string" },
        email: { bsonType: "string" },
        created_at: { bsonType: "date" }
      }
    }
  }
})

// 2. 创建产品集合
db.createCollection("products")

// 3. 创建订单集合
db.createCollection("orders")

// 4. 创建日志固定集合
db.createCollection("app_logs", {
  capped: true,
  size: 52428800,  // 50MB
  max: 50000
})

// 5. 查看所有集合
show collections

修改集合

修改验证规则

javascript
db.runCommand({
  collMod: "users",
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "email", "age"],
      properties: {
        name: { bsonType: "string" },
        email: { bsonType: "string" },
        age: { bsonType: "int", minimum: 18 }
      }
    }
  },
  validationLevel: "moderate"
})

集合信息

获取集合详细信息

javascript
// 集合统计
db.users.stats()

// 集合选项
db.getCollectionInfos({ name: "users" })

// 验证规则
db.getCollectionInfos({ name: "users" })[0].options.validator

最佳实践

1. 命名规范

javascript
// 推荐
db.user_profiles
db.order_items
db.system_logs

// 不推荐
db.UserProfiles    // 大小写混合
db.order-items     // 连字符
db.data            // 过于笼统

2. 集合设计

javascript
// 相关数据放同一集合
db.users        // 用户基本信息
db.user_profiles // 用户详细资料(一对一)

// 或者嵌入
db.users = {
  basic_info: {...},
  profile: {...}
}

3. 使用验证

javascript
// 生产环境建议启用验证
db.createCollection("payments", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["amount", "currency", "status"],
      properties: {
        amount: { bsonType: "decimal" },
        currency: { enum: ["CNY", "USD", "EUR"] },
        status: { enum: ["pending", "completed", "failed"] }
      }
    }
  }
})

总结

创建集合要点:

  • 通常使用隐式创建(插入文档时自动创建)
  • 固定集合适合日志类数据
  • 可以使用验证规则确保数据质量
  • 遵循命名规范便于维护

在下一章中,我们将学习 MongoDB 删除集合