RELATEED CONSULTING
相关咨询
欢迎选择下列在线客服咨询
微信客服
微信客服二维码
热线电话:13863516421
7x24小时,全年无休
我们服务器的承诺:
关闭右侧工具栏

境外国外服务器专题

如何在MongoDB中更新和删除文档?

  • 来源:本站
  • 编辑: 超级管理员
  • 时间:2025-05-22 10:39:23
  • 阅读0次


在 MongoDB 中更新和删除文档是日常数据操作的核心功能,以下是详细的操作方法和示例:

一、更新文档(Update)

1. 基本更新操作

使用updateOne()、updateMany()或replaceOne()方法:


javascript

// 更新单个文档(匹配name为Alice的第一条记录)

db.users.updateOne(

  { name: "Alice" },          // 查询条件

  { $set: { age: 31 } }       // 更新操作符

)


// 更新所有匹配文档(将所有用户的status设为active)

db.users.updateMany(

  {},                        // 空条件表示匹配所有文档

  { $set: { status: "active" } }

)


// 替换整个文档(保留_id,替换其他字段)

db.users.replaceOne(

  { name: "Bob" },

  { name: "Robert", role: "editor", age: 26 }

)

2. 常用更新操作符

操作符 作用 示例

$set 设置字段值 { $set: { age: 30 } }

$unset 删除字段 { $unset: { role: "" } }

$inc 增加 / 减少数值 { $inc: { score: 5 } }

$mul 乘某个值 { $mul: { price: 1.1 } }

$push 向数组添加元素 { $push: { tags: "newtag" } }

$pull 从数组移除元素 { $pull: { tags: "oldtag" } }

$addToSet 添加元素到集合(去重) { $addToSet: { colors: "red" } }

$rename 重命名字段 { $rename: { oldName: "newName" } }

3. 更新示例

javascript

// 文档结构:{ name: "Alice", scores: [85, 90], metadata: { created: ISODate() } }


// 原子性更新(增加数值+添加数组元素)

db.users.updateOne(

  { name: "Alice" },

  { 

    $inc: { "metadata.version": 1 },

    $push: { scores: 95 },

    $set: { "metadata.lastUpdated": new Date() }

  }

)


// 使用数组过滤器更新嵌套文档

db.orders.updateOne(

  { order_id: 123 },

  { $set: { "items.$[elem].quantity": 3 } },

  { arrayFilters: [ { "elem.product": "Laptop" } ] }

)

二、删除文档(Delete)

1. 删除单个文档

javascript

// 删除匹配条件的第一个文档

db.users.deleteOne({ name: "Alice" })

2. 删除多个文档

javascript

// 删除所有匹配条件的文档

db.users.deleteMany({ status: "inactive" })


// 删除集合中所有文档(保留集合结构)

db.users.deleteMany({})  // 等价于 db.users.remove({})

3. 条件删除示例

javascript

// 删除30天前的日志

db.logs.deleteMany({

  timestamp: { $lt: new Date(Date.now() - 30 * 24 * 60 * 60 * 1000) }

})


// 删除所有空数组的文档

db.posts.deleteMany({ comments: { $size: 0 } })

三、重要注意事项

安全删除建议:

删除前先查询验证:db.collection.find(条件)

测试环境验证后再生产执行

使用limit参数防止意外删除过多:

javascript

// 仅删除前10个匹配文档(MongoDB 4.4+)

db.users.deleteMany({ status: "inactive" }).limit(10)


原子性保证:

MongoDB 的单个写操作(如updateOne)是原子性的,但跨文档操作需使用事务(MongoDB 4.0+):

javascript

session.startTransaction();

try {

  db.accounts.updateOne({ _id: 1 }, { $inc: { balance: -100 } });

  db.accounts.updateOne({ _id: 2 }, { $inc: { balance: 100 } });

  session.commitTransaction();

} catch (error) {

  session.abortTransaction();

}


性能优化:

更新时尽量使用操作符(如$inc)而非替换整个文档

删除大量数据时考虑分批处理:

javascript

while (db.logs.deleteMany({ timestamp: { $lt: cutoff } }).deletedCount > 0);


四、常见问题

如何 upsert(不存在则插入)?

javascript

db.users.updateOne(

  { email: "newuser@example.com" },

  { $setOnInsert: { name: "New User", role: "guest" } },

  { upsert: true }

)


如何统计更新 / 删除的文档数?

javascript

const result = db.users.updateMany(

  { status: "active" },

  { $set: { verified: true } }

);

print(result.modifiedCount);  // 输出修改的文档数


如何删除集合 / 数据库?

javascript

// 删除集合(保留数据库)

db.users.drop()


// 删除当前数据库

db.dropDatabase()


五、验证操作结果

javascript

// 查看更新结果

const updateResult = db.users.updateOne(

  { name: "Bob" },

  { $set: { age: 27 } }

);

printjson(updateResult);  // 输出:{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }


// 查看删除结果

const deleteResult = db.users.deleteMany({ role: "guest" });

print(deleteResult.deletedCount + " documents deleted");


我们提供7X24小时售后服务,了解更多机房产品和服务,敬请联系
购买咨询 售后服务