Skip to content

MongoDB 插入文档

MongoDB 提供了多种插入文档的方法,可以插入单个文档或多个文档。

插入单个文档

insertOne() 方法

javascript
db.collection.insertOne(document, options)

基本示例

javascript
// 插入单个文档
db.users.insertOne({
  name: "张三",
  age: 25,
  email: "zhangsan@example.com",
  createdAt: new Date()
})

返回结果

json
{
  "acknowledged": true,
  "insertedId": ObjectId("65a1b2c3d4e5f6g7h8i9j0k1")
}

插入多个文档

insertMany() 方法

javascript
db.collection.insertMany(documents, options)

基本示例

javascript
// 插入多个文档
db.users.insertMany([
  {
    name: "张三",
    age: 25,
    email: "zhangsan@example.com"
  },
  {
    name: "李四",
    age: 30,
    email: "lisi@example.com"
  },
  {
    name: "王五",
    age: 28,
    email: "wangwu@example.com"
  }
])

返回结果

json
{
  "acknowledged": true,
  "insertedIds": [
    ObjectId("65a1b2c3d4e5f6g7h8i9j0k1"),
    ObjectId("65a1b2c3d4e5f6g7h8i9j0k2"),
    ObjectId("65a1b2c3d4e5f6g7h8i9j0k3")
  ]
}

插入选项

ordered 选项

javascript
// ordered: true(默认)- 遇到错误停止
db.users.insertMany([
  { name: "A" },
  { name: "B" },
  { _id: 1, name: "C" },
  { _id: 1, name: "D" }  // 重复 _id,会报错停止
], { ordered: true })

// ordered: false - 遇到错误继续
db.users.insertMany([
  { name: "A" },
  { name: "B" },
  { _id: 1, name: "C" },
  { _id: 1, name: "D" }  // 重复 _id,报错但继续插入其他
], { ordered: false })

writeConcern 选项

javascript
db.users.insertOne(
  { name: "张三", age: 25 },
  {
    writeConcern: {
      w: "majority",      // 等待大多数节点确认
      j: true,            // 写入日志
      wtimeout: 5000      // 超时时间(毫秒)
    }
  }
)

指定 _id 字段

自定义 _id

javascript
// 使用字符串作为 _id
db.users.insertOne({
  _id: "user_001",
  name: "张三",
  age: 25
})

// 使用数字作为 _id
db.products.insertOne({
  _id: 1001,
  name: "iPhone",
  price: 5999
})

复合 _id

javascript
db.orders.insertOne({
  _id: {
    orderNo: "ORD2024001",
    sequence: 1
  },
  customer: "张三",
  amount: 1000
})

插入嵌套文档

基本嵌套

javascript
db.users.insertOne({
  name: "张三",
  address: {
    street: "长安街1号",
    city: "北京",
    zipCode: "100000"
  },
  contacts: {
    phone: "13800138000",
    email: "zhangsan@example.com"
  }
})

数组嵌套

javascript
db.products.insertOne({
  name: "iPhone 15 Pro",
  colors: ["黑色", "白色", "蓝色"],
  specs: [
    { type: "存储", value: "256GB" },
    { type: "屏幕", value: "6.1英寸" }
  ],
  tags: ["手机", "苹果", "旗舰"]
})

插入日期和时间

当前时间

javascript
db.events.insertOne({
  name: "用户注册",
  timestamp: new Date(),           // 当前 UTC 时间
  localTime: new Date().toLocaleString()
})

指定时间

javascript
db.events.insertOne({
  name: "会议",
  startTime: new Date("2024-01-20T10:00:00Z"),
  endTime: ISODate("2024-01-20T12:00:00Z")
})

插入二进制数据

BinData

javascript
db.files.insertOne({
  filename: "document.pdf",
  contentType: "application/pdf",
  data: BinData(0, "base64encodedstring...")
})

批量插入最佳实践

分批插入

javascript
// 大量数据分批插入
var batchSize = 1000
var totalDocs = 10000

for (var i = 0; i < totalDocs; i += batchSize) {
  var batch = []
  for (var j = 0; j < batchSize && (i + j) < totalDocs; j++) {
    batch.push({
      index: i + j,
      data: "Sample data " + (i + j),
      createdAt: new Date()
    })
  }
  db.bulkdata.insertMany(batch)
  print("已插入 " + (i + batch.length) + " 条")
}

错误处理

javascript
try {
  var result = db.users.insertMany([
    { name: "张三" },
    { name: "李四" },
    { _id: "existing_id", name: "王五" }  // 可能重复的 _id
  ], { ordered: false })
  
  print("成功插入:", result.insertedIds.length)
} catch (e) {
  print("插入错误:", e)
  if (e.writeErrors) {
    e.writeErrors.forEach(function(err) {
      print("错误文档索引:", err.index)
      print("错误信息:", err.errmsg)
    })
  }
}

插入验证

检查插入结果

javascript
var result = db.users.insertOne({
  name: "张三",
  age: 25
})

if (result.acknowledged) {
  print("插入成功,ID:", result.insertedId)
} else {
  print("插入失败")
}

总结

插入文档要点:

  • insertOne() 插入单个文档
  • insertMany() 批量插入更高效
  • 不指定 _id 时自动生成 ObjectId
  • 使用 ordered: false 提高批量插入容错性
  • 大批量数据建议分批插入

在下一章中,我们将学习 MongoDB 查询文档