如何在 MongoDB 中插入文档

MongoDBMongoDBBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本全面教程将探讨在强大且灵活的 NoSQL 数据库 MongoDB 中插入文档的基本技术。无论你是初学者还是有经验的开发者,都将学习如何使用各种插入方法和最佳实践,高效地向 MongoDB 集合中添加数据。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/ArrayandEmbeddedDocumentsGroup(["Array and Embedded Documents"]) mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/SchemaDesignGroup(["Schema Design"]) mongodb/BasicOperationsGroup -.-> mongodb/insert_document("Insert Document") mongodb/BasicOperationsGroup -.-> mongodb/bulk_insert_documents("Bulk Insert Documents") mongodb/DataTypesGroup -.-> mongodb/use_numeric_data_types("Use Numeric Data Types") mongodb/DataTypesGroup -.-> mongodb/use_string_data_types("Use String Data Types") mongodb/DataTypesGroup -.-> mongodb/work_with_array_data_types("Work with Array Data Types") mongodb/SchemaDesignGroup -.-> mongodb/design_order_schema("Design Order Schema") mongodb/ArrayandEmbeddedDocumentsGroup -.-> mongodb/create_embedded_documents("Create Embedded Documents") subgraph Lab Skills mongodb/insert_document -.-> lab-435311{{"如何在 MongoDB 中插入文档"}} mongodb/bulk_insert_documents -.-> lab-435311{{"如何在 MongoDB 中插入文档"}} mongodb/use_numeric_data_types -.-> lab-435311{{"如何在 MongoDB 中插入文档"}} mongodb/use_string_data_types -.-> lab-435311{{"如何在 MongoDB 中插入文档"}} mongodb/work_with_array_data_types -.-> lab-435311{{"如何在 MongoDB 中插入文档"}} mongodb/design_order_schema -.-> lab-435311{{"如何在 MongoDB 中插入文档"}} mongodb/create_embedded_documents -.-> lab-435311{{"如何在 MongoDB 中插入文档"}} end

MongoDB 文档基础

什么是 MongoDB 文档?

在 MongoDB 中,文档是数据存储的基本单元,类似于关系型数据库中的行,但结构更加灵活。与传统表不同,MongoDB 文档以 BSON(二进制 JSON)格式存储,这允许更复杂和嵌套的数据表示。

文档结构

MongoDB 文档由字段 - 值对组成,具有以下关键特征:

graph TD A[MongoDB 文档] --> B[字段 1] A --> C[字段 2] A --> D[字段 3] B --> E[键: 值] C --> F[键: 值] D --> G[键: 值]

关键特性

  • 灵活的模式
  • 支持嵌套对象
  • 动态添加字段
  • 最大文档大小为 16MB

文档示例

以下是一个典型的 MongoDB 文档示例:

{
    "_id": ObjectId("5f8d7a3b9d3b2a1b1c9d1e1f"),
    "username": "labexuser",
    "email": "[email protected]",
    "age": 28,
    "skills": ["Python", "MongoDB", "Docker"],
    "profile": {
        "country": "新加坡",
        "experience": 5
    }
}

文档约束

约束 描述
最大大小 16MB
字段名限制 不能以 '$' 开头或包含 '.'
唯一标识符 每个文档都有一个唯一的 _id 字段

MongoDB 中的文档类型

MongoDB 支持多种数据类型:

  • 字符串
  • 整数
  • 双精度浮点数
  • 布尔值
  • 数组
  • 对象
  • 时间戳
  • 日期
  • 对象 ID
  • 空值

在 MongoDB 中创建文档

要创建文档,可以使用以下方法:

  • insertOne()
  • insertMany()
  • save()

Ubuntu 22.04 上的示例:

## 连接到 MongoDB

## 切换到一个数据库

## 插入一个文档

最佳实践

  1. 保持文档相对较小
  2. 使用有意义的字段名
  3. 仔细考虑文档结构
  4. 利用 MongoDB 的灵活模式

通过了解这些文档基础,在你的实验(LabEx)学习之旅中,你将为有效地使用 MongoDB 做好充分准备。

插入技术

基本插入方法

MongoDB 提供了几种将文档插入集合的方法:

graph TD A[插入方法] --> B[insertOne()] A --> C[insertMany()] A --> D[save()]

insertOne() 方法

insertOne() 方法将单个文档插入集合:

## 连接到 MongoDB

## 切换到数据库

## 插入单个文档

insertMany() 方法

insertMany() 方法允许同时插入多个文档:

## 插入多个文档

插入策略

有序插入与无序插入

类型 行为 性能
有序 遇到第一个错误即停止 较慢
无序 遇到错误后继续 较快

无序插入示例:

db.users.insertMany(
    [文档],
    { ordered: false }
)

高级插入技术

处理重复文档

## 使用 replaceOne 并设置 upsert

插入时验证

graph TD A[文档插入] --> B{验证} B --> |通过| C[插入文档] B --> |失败| D[拒绝插入]

批量写入操作

db.users.bulkWrite([
    {
        insertOne: {
            document: {
                "username": "bulk_user1",
                "email": "[email protected]"
            }
        }
    },
    {
        updateOne: {
            filter: { "username": "现有用户" },
            update: { $set: { "email": "[email protected]" } }
        }
    }
])

性能考量

  1. 对大型数据集使用批量插入
  2. 尽量减少网络往返次数
  3. 考虑写入关注级别
  4. 使用适当的索引

错误处理

try {
    db.users.insertOne(文档)
} catch (error) {
    print("插入失败: " + error.message)
}

最佳实践

  • 插入前验证文档
  • 使用适当的写入关注
  • 处理潜在的重复项
  • 监控插入性能

通过掌握这些插入技术,在你的实验(LabEx)学习过程中,你将能够有效地管理 MongoDB 集合中的数据。

高级插入策略

批量写入操作

批量写入操作允许在单个请求中执行多个写入操作:

graph TD A[批量写入] --> B[插入] A --> C[更新] A --> D[删除] A --> E[替换]

批量写入示例

db.users.bulkWrite([
    {
        insertOne: {
            document: {
                "username": "labex_user1",
                "email": "[email protected]"
            }
        }
    },
    {
        updateOne: {
            filter: { "username": "现有用户" },
            update: { $set: { "status": "active" } }
        }
    }
])

写入关注策略

写入关注 描述 性能
w: 0 不进行确认 最快
w: 1 确认主节点 平衡
w: majority 多数副本确认 最可靠

配置写入关注

db.users.insertOne(
    { "username": "labex_user" },
    {
        writeConcern: {
            w: "majority",
            wtimeout: 5000
        }
    }
)

原子文档更新

原子操作符

graph TD A[原子操作符] --> B[$set] A --> C[$inc] A --> D[$push] A --> E[$pull]

原子更新示例

db.users.updateOne(
    { "username": "labex_user" },
    {
        $set: { "email": "[email protected]" },
        $inc: { "login_count": 1 }
    }
)

插入或更新操作

插入或更新操作将插入和更新结合起来:

db.users.updateOne(
    { "username": "labex_user" },
    {
        $set: {
            "email": "[email protected]",
            "last_login": new Date()
        }
    },
    { upsert: true }
)

文档验证

模式验证规则

db.createCollection("users", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: ["username", "email"],
         properties: {
            username: {
               bsonType: "string",
               description: "必须是字符串且为必填项"
            },
            email: {
               bsonType: "string",
               pattern: "^.+@labex\\.io$",
               description: "必须是有效的 LabEx 电子邮件"
            }
         }
      }
   }
})

优化插入性能

  1. 使用批量插入
  2. 最小化文档大小
  3. 创建适当的索引
  4. 明智地使用写入关注

错误处理策略

try {
    const result = db.users.insertMany(文档, { ordered: false });
    print("插入了 " + result.insertedCount + " 个文档");
} catch (error) {
    print("批量插入遇到错误: " + error.message);
    print("部分插入的文档数: " + error.result.nInserted);
}

高级插入模式

时间序列数据插入

db.performance_logs.insertOne({
    "timestamp": new Date(),
    "server": "labex-server-01",
    "cpu_usage": 65.5,
    "memory_usage": 4096
})

最佳实践

  • 使用批量操作提高效率
  • 实施适当的错误处理
  • 插入前验证文档
  • 选择合适的写入关注
  • 监控并优化插入性能

通过掌握这些高级插入策略,在你的实验(LabEx)学习过程中,你将能够熟练地管理 MongoDB 中的复杂数据场景。

总结

通过掌握 MongoDB 文档插入技术,开发者能够在 NoSQL 数据库中有效地管理和操作数据。本教程深入介绍了基本和高级插入策略,使你能够在 MongoDB 中自信且精确地处理复杂的数据插入场景。