面试题答案
一键面试- 创建角色并赋予权限:
- 登录到MongoDB的admin数据库,使用
use admin
命令。 - 创建一个具有执行银行转账事务所需权限的角色。例如,如果转账操作涉及对
bank
数据库中accounts
集合的读写操作,可以这样创建角色:
- 登录到MongoDB的admin数据库,使用
db.createRole(
{
role: "bankTransferRole",
privileges: [
{
resource: { db: "bank", collection: "accounts" },
actions: [ "find", "update" ]
}
],
roles: []
}
)
- 创建用户并分配角色:
- 同样在
admin
数据库下,创建一个用户并分配上述创建的bankTransferRole
角色:
- 同样在
db.createUser(
{
user: "bankTransferUser",
pwd: "password123",
roles: [ { role: "bankTransferRole", db: "admin" } ]
}
)
- 在事务代码中使用该用户:
- 在应用程序连接MongoDB时,使用
bankTransferUser
这个用户进行连接,这样只有这个具有bankTransferRole
角色的用户能执行银行转账事务操作。例如在Node.js中使用mongodb
驱动连接时:
- 在应用程序连接MongoDB时,使用
const { MongoClient } = require('mongodb');
const uri = "mongodb://bankTransferUser:password123@localhost:27017/?authSource=admin";
const client = new MongoClient(uri);
async function transferFunds() {
try {
await client.connect();
const session = client.startSession();
session.startTransaction();
// 银行转账的具体操作代码,例如更新账户余额
const sourceAccountCollection = client.db('bank').collection('accounts');
const destinationAccountCollection = client.db('bank').collection('accounts');
// 执行转账操作的更新语句
await sourceAccountCollection.updateOne({ accountNumber: "12345" }, { $inc: { balance: -100 } }, { session });
await destinationAccountCollection.updateOne({ accountNumber: "67890" }, { $inc: { balance: 100 } }, { session });
await session.commitTransaction();
} catch (e) {
console.error(e);
await session.abortTransaction();
} finally {
await client.close();
}
}
transferFunds();
在上述步骤中,通过创建特定权限的角色,并将角色分配给用户,然后在事务代码中使用该用户连接,确保了只有特定角色的用户能执行银行转账事务。