面试题答案
一键面试优化思路
- 使用事务:MongoDB 4.0 及以上版本支持多文档事务,利用事务可以将多个操作作为一个原子单元,要么全部成功,要么全部回滚,从而保证数据一致性。
- 错误处理:在事务块中捕获异常,一旦出现错误,执行回滚操作。
- 批量操作:尽量使用批量插入、更新和删除操作,减少数据库交互次数,提高执行效率。
优化后的脚本代码
假设使用的是JavaScript编写MongoDB Shell脚本,示例如下:
// 连接到MongoDB
const { MongoClient } = require('mongodb');
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
async function runScript() {
try {
await client.connect();
const session = client.startSession();
session.startTransaction();
const db = client.db('yourDatabase');
const collection1 = db.collection('collection1');
const collection2 = db.collection('collection2');
// 批量插入操作
const insertData1 = [
{ name: 'data1', value: 1 },
{ name: 'data2', value: 2 }
];
await collection1.insertMany(insertData1, { session });
// 批量更新操作
const updateData2 = { $set: { status: 'updated' } };
const updateFilter2 = { category: 'specific' };
await collection2.updateMany(updateFilter2, updateData2, { session });
// 批量删除操作
const deleteFilter1 = { type: 'old' };
await collection1.deleteMany(deleteFilter1, { session });
await session.commitTransaction();
console.log('All operations completed successfully');
} catch (error) {
console.error('An error occurred:', error);
// 出现错误时回滚事务
if (session) {
await session.abortTransaction();
}
} finally {
await client.close();
}
}
runScript();
上述代码首先连接到MongoDB数据库,开启一个事务会话。在事务块中,进行了批量插入、更新和删除操作。如果任何一个操作失败,通过catch
块捕获异常并回滚事务。最后关闭数据库连接。这样可以确保在出现错误时数据的一致性,并通过批量操作提高了执行效率。