原创 spring java 实现执行原生 mongodb CRUD 命令
分类:MongoDB,spring 130人阅读 IT小君 2023-03-30 10:39
背景:一般我们在mongodb 客户端都是使用mongodb-shell执行monogo sql,但是一般我们代码中不会引入Mongo shell 实现的驱动,而且mongodb shell在java 代码中实现并不灵活,还会出现没有权限的情况。所以本文采用mongodb 原生的sql方式实现,支持CRUD所有操作,但结果解析各异。
命令格式如下
db.runCommand(
{
aggregate: "<collection>" || 1,
pipeline: [ <stage>, <...> ],
explain: <boolean>,
allowDiskUse: <boolean>,
cursor: <document>,
maxTimeMS: <int>,
bypassDocumentValidation: <boolean>,
readConcern: <document>,
collation: <document>,
hint: <string or document>,
comment: <any>,
writeConcern: <document>,
let: <document> // Added in MongoDB 5.0
}
)
比如update:
{ update: "box", updates: [ { q: { "id":"7854"}, u: { $set: { "boxNum":"BOX-001"} }} ] }
具体格式请参考官网:https://www.mongodb.com/docs/manual/reference/command/nav-crud/
关于数据库账号密码等配置信息的拉取请参考前文:spring cloud 根据profile 配置拉取其他服务配置(spring cloud 配置拉取实现)
代码实现(结果解析只实现了update):
public static String runSql(String sql, Map < String, String > config) {
try (MongoClient mongoClient = conn(config)) {
Document result = mongoClient.getDatabase(config.get("database")).runCommand(Document.parse(sql));
return result.getInteger("nModified") > 0 ? "FAIL" : "SUCCESS";
}
}
public MongoClient conn(Map < String, String > config) {
ServerAddress serverAddress = new ServerAddress(config.get("ip"), Integer.parseInt(config.get("port")));
List < ServerAddress > addrs = new ArrayList();
addrs.add(serverAddress);
MongoCredential credential = MongoCredential.createScramSha1Credential(config.get("username"), config.get("database"), config.get("password").toCharArray());
List < MongoCredential > credentials = new ArrayList();
credentials.add(credential);
return new MongoClient(addrs, credentials);
}