Mongo C#驱动中,如何通过含指定库的连接字符串直接ListCollections?
关于MongoDB连接字符串指定数据库后仍需调用GetDatabase的疑问解答
我在使用MongoDB .NET驱动时,已经用包含目标数据库
myDb的完整连接字符串实例化了MongoClient:MongoClient dbClient = new MongoClient("mongodb://***:***@***:27017/myDb");执行
var dbList = dbClient.ListDatabases();是正常的,但要列出myDb的集合时,必须先调用IMongoDatabase db = dbClient.GetDatabase("myDb")获取数据库实例,再执行var collList = db.ListCollections().ToList()才能正常运行。
我的疑问是:连接字符串里已经指定了myDb,为什么还要重复调用GetDatabase来指定数据库?有没有办法直接列出连接字符串中指定数据库的集合?
这个问题问得很实在!其实这是MongoDB驱动设计逻辑的体现,我给你分两部分解释:
为什么必须调用GetDatabase?
连接字符串里的myDb是默认数据库,它的作用和你理解的“自动绑定数据库”不是一回事:
- 核心作用是身份验证:MongoDB的用户权限是和数据库绑定的,指定默认数据库后,驱动会用这个数据库来验证你的账号权限(比如SCRAM认证)。
- 只是默认候选,不是自动绑定:
MongoClient是整个集群的客户端入口,它可以操作集群里所有你有权限访问的数据库,而不是只能盯着默认数据库。驱动不会自动帮你绑定到这个数据库——毕竟你可能接下来要操作其他数据库呢?
简单说,MongoClient管的是“连接集群”,IMongoDatabase管的是“操作某个具体数据库”,这俩职责是分开的,所以必须明确指定要操作的数据库实例。
能不能不用手动重复输入数据库名?
当然可以!你可以从连接字符串里解析出默认数据库的名称,再自动传入GetDatabase,这样就不用手动重复写myDb了,代码更优雅:
var connectionString = "mongodb://***:***@***:27017/myDb"; // 解析连接字符串获取MongoUrl对象 var mongoUrl = new MongoUrl(connectionString); var dbClient = new MongoClient(mongoUrl); // 直接用解析出来的默认数据库名 var targetDb = dbClient.GetDatabase(mongoUrl.DatabaseName); var collList = targetDb.ListCollections().ToList();
这里有个小细节要注意:如果连接字符串里没指定默认数据库,mongoUrl.DatabaseName会返回null,这时候你可以加个判断,比如指定默认值或者抛出提示。
内容的提问来源于stack exchange,提问作者Royi Namir
相关产品推荐
相关产品推荐

