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 查询文档。