Amazon DocumentDB 集合操作 #

一、集合概述 #

1.1 集合概念 #

text
DocumentDB集合:
├── 文档的逻辑分组容器
├── 类似关系数据库的表
├── 无固定模式(Schema-less)
├── 支持文档验证规则
└── 自动创建默认索引(_id)

1.2 集合命名规则 #

text
命名规则:
├── 不能包含:$ 或 null字符
├── 不能以"system."开头
├── 不能包含点号(嵌套除外)
├── 长度限制:120字节
├── 区分大小写
└── 建议:使用复数形式、小写字母

二、创建集合 #

2.1 显式创建 #

javascript
// 基本创建
db.createCollection("users")

// 输出
{ "ok": 1 }

// 带选项创建
db.createCollection("logs", {
  capped: false,
  autoIndexId: true
})

2.2 隐式创建 #

javascript
// 插入文档时自动创建集合
db.products.insertOne({
  name: "商品A",
  price: 99.99
})

// 集合自动创建
show collections
// 输出包含 products

2.3 创建带验证规则的集合 #

javascript
// 使用JSON Schema验证
db.createCollection("users", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "email"],
      properties: {
        name: {
          bsonType: "string",
          description: "必须为字符串类型"
        },
        email: {
          bsonType: "string",
          pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
          description: "必须为有效的邮箱地址"
        },
        age: {
          bsonType: "int",
          minimum: 0,
          maximum: 150,
          description: "必须为0-150之间的整数"
        },
        role: {
          enum: ["user", "admin", "guest"],
          description: "只能是user、admin或guest"
        }
      }
    }
  },
  validationLevel: "strict",
  validationAction: "error"
})

2.4 验证规则选项 #

text
validationLevel:
├── strict:所有插入和更新都验证
├── moderate:仅验证符合现有规则的文档
└── off:禁用验证

validationAction:
├── error:拒绝无效文档
└── warn:允许但记录警告

三、查看集合 #

3.1 列出所有集合 #

javascript
// 显示所有集合
show collections

// 或使用函数
db.getCollectionNames()

// 输出示例
[
  "users",
  "products",
  "orders",
  "logs"
]

3.2 查看集合详情 #

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

// 输出
{
  "ns": "mydb.users",
  "count": 1000,
  "size": 128000,
  "avgObjSize": 128,
  "storageSize": 256000,
  "nindexes": 2,
  "totalIndexSize": 65536,
  "indexSizes": {
    "_id_": 32768,
    "email_1": 32768
  }
}

// 简化统计
db.users.stats({ scale: 1024 })  // 以KB为单位

3.3 查看集合选项 #

javascript
// 查看集合选项
db.users.getCollectionInfos()

// 输出
[
  {
    "name": "users",
    "type": "collection",
    "options": {
      "validator": { ... }
    },
    "info": {
      "readOnly": false
    }
  }
]

3.4 查看验证规则 #

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

四、修改集合 #

4.1 添加验证规则 #

javascript
// 为现有集合添加验证规则
db.runCommand({
  collMod: "users",
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "email"],
      properties: {
        name: { bsonType: "string" },
        email: { bsonType: "string" }
      }
    }
  },
  validationLevel: "strict",
  validationAction: "error"
})

4.2 修改验证规则 #

javascript
// 更新验证规则
db.runCommand({
  collMod: "users",
  validator: {
    $or: [
      { phone: { $type: "string" } },
      { email: { $regex: /@/ } }
    ]
  }
})

4.3 移除验证规则 #

javascript
// 禁用验证
db.runCommand({
  collMod: "users",
  validator: {},
  validationLevel: "off"
})

4.4 重命名集合 #

javascript
// 重命名集合
db.users.renameCollection("customers")

// 跨数据库重命名(DocumentDB不支持)
// 需要手动导出导入

五、删除集合 #

5.1 删除单个集合 #

javascript
// 删除集合
db.users.drop()

// 输出
true  // 删除成功
false // 集合不存在

// 删除前检查
if (db.users.countDocuments({}) === 0) {
  db.users.drop();
}

5.2 批量删除集合 #

javascript
// 删除所有匹配的集合
db.getCollectionNames().forEach(function(name) {
  if (name.startsWith("temp_")) {
    db[name].drop();
    print("Dropped: " + name);
  }
});

5.3 删除注意事项 #

text
删除前检查:
├── 确认集合名称
├── 检查是否有重要数据
├── 确认索引依赖
├── 检查应用引用
└── 确认权限

六、集合索引管理 #

6.1 查看索引 #

javascript
// 查看集合索引
db.users.getIndexes()

// 输出
[
  {
    "v": 2,
    "key": { "_id": 1 },
    "name": "_id_"
  },
  {
    "v": 2,
    "key": { "email": 1 },
    "name": "email_1",
    "unique": true
  }
]

6.2 创建索引 #

javascript
// 创建单字段索引
db.users.createIndex({ email: 1 })

// 创建复合索引
db.users.createIndex({ name: 1, age: -1 })

// 创建唯一索引
db.users.createIndex(
  { email: 1 },
  { unique: true }
)

// 创建稀疏索引
db.users.createIndex(
  { nickname: 1 },
  { sparse: true }
)

// 创建文本索引
db.articles.createIndex(
  { content: "text" }
)

6.3 删除索引 #

javascript
// 删除指定索引
db.users.dropIndex("email_1")

// 删除所有索引(保留_id)
db.users.dropIndexes()

// 删除多个索引
db.users.dropIndexes(["email_1", "name_1"])

七、集合数据操作 #

7.1 批量插入 #

javascript
// 批量插入
db.users.insertMany([
  { name: "用户1", email: "user1@example.com" },
  { name: "用户2", email: "user2@example.com" },
  { name: "用户3", email: "user3@example.com" }
])

7.2 批量更新 #

javascript
// 批量更新
db.users.updateMany(
  { status: "pending" },
  { $set: { status: "active" } }
)

7.3 批量删除 #

javascript
// 批量删除
db.users.deleteMany({
  createdAt: { $lt: new Date("2023-01-01") }
})

八、集合性能优化 #

8.1 分析查询性能 #

javascript
// 使用explain分析查询
db.users.find({ email: "test@example.com" }).explain("executionStats")

// 输出关键信息
{
  "executionStats": {
    "totalDocsExamined": 1,
    "totalKeysExamined": 1,
    "executionTimeMillis": 0,
    "indexUsed": "email_1"
  }
}

8.2 索引优化 #

javascript
// 查看索引使用情况
db.users.aggregate([
  { $indexStats: {} }
])

// 输出
{
  "name": "email_1",
  "accesses": {
    "ops": 1000,
    "since": ISODate("2024-01-01T00:00:00Z")
  }
}

8.3 存储优化 #

javascript
// 查看存储统计
db.users.stats()

// 整理集合(减少碎片)
db.runCommand({ compact: "users" })

九、集合验证规则详解 #

9.1 JSON Schema验证 #

javascript
// 完整的验证规则示例
db.createCollection("products", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "price", "category"],
      properties: {
        _id: {
          bsonType: "objectId"
        },
        name: {
          bsonType: "string",
          minLength: 1,
          maxLength: 100,
          description: "产品名称,1-100字符"
        },
        price: {
          bsonType: "decimal",
          minimum: 0,
          exclusiveMinimum: true,
          description: "价格必须大于0"
        },
        category: {
          enum: ["electronics", "clothing", "food", "other"],
          description: "产品类别"
        },
        tags: {
          bsonType: "array",
          items: {
            bsonType: "string"
          },
          minItems: 0,
          maxItems: 10,
          description: "标签数组,最多10个"
        },
        stock: {
          bsonType: "object",
          required: ["quantity", "warehouse"],
          properties: {
            quantity: {
              bsonType: "int",
              minimum: 0
            },
            warehouse: {
              bsonType: "string"
            }
          }
        },
        metadata: {
          bsonType: "object",
          additionalProperties: true
        }
      },
      additionalProperties: false
    }
  }
})

9.2 查询表达式验证 #

javascript
// 使用查询表达式验证
db.createCollection("orders", {
  validator: {
    $and: [
      { orderDate: { $type: "date" } },
      { totalAmount: { $gte: 0 } },
      {
        $or: [
          { status: "pending" },
          { status: "completed" },
          { status: "cancelled" }
        ]
      }
    ]
  }
})

9.3 验证错误处理 #

javascript
// 验证失败示例
try {
  db.products.insertOne({
    name: "产品A",
    price: -10,  // 违反minimum规则
    category: "electronics"
  });
} catch (error) {
  print("验证失败: " + error.message);
}

// 使用warn模式
db.runCommand({
  collMod: "products",
  validationAction: "warn"
})

// 无效文档会被插入,但记录警告

十、集合最佳实践 #

10.1 命名约定 #

text
命名建议:
├── 使用复数形式
├── 使用小写字母
├── 使用下划线分隔
├── 使用有意义的名称
└── 保持命名一致性

示例:
├── users(用户集合)
├── products(产品集合)
├── order_items(订单项集合)
└── user_sessions(用户会话集合)

10.2 模式设计 #

text
设计原则:
├── 根据访问模式设计
├── 避免过度嵌套
├── 考虑查询性能
├── 平衡冗余和规范化
└── 考虑数据增长

10.3 索引策略 #

text
索引建议:
├── 为常用查询字段创建索引
├── 复合索引注意字段顺序
├── 避免过多索引
├── 定期监控索引使用
└── 删除未使用的索引

十一、常见问题 #

11.1 集合创建失败 #

javascript
// 问题:集合已存在
// 解决:先检查再创建
if (!db.getCollectionNames().includes("users")) {
  db.createCollection("users");
}

11.2 验证规则过于严格 #

javascript
// 问题:现有数据不符合新规则
// 解决:使用moderate级别
db.runCommand({
  collMod: "users",
  validator: { ... },
  validationLevel: "moderate"
})

11.3 索引创建超时 #

javascript
// 问题:大数据量索引创建超时
// 解决:后台创建
db.users.createIndex(
  { name: 1 },
  { background: true }
)

十二、总结 #

12.1 集合操作速查 #

操作 命令
创建集合 db.createCollection(“name”)
查看集合 show collections
删除集合 db.collection.drop()
重命名 db.collection.renameCollection(“newname”)
查看统计 db.collection.stats()
查看索引 db.collection.getIndexes()
创建索引 db.collection.createIndex({field: 1})
删除索引 db.collection.dropIndex(“name”)

12.2 最佳实践总结 #

text
关键要点:
├── 合理命名集合
├── 使用验证规则保证数据质量
├── 优化索引策略
├── 监控集合性能
└── 定期维护

下一步,让我们学习文档插入!

最后更新:2026-03-27