【问题标题】:Database in MongoDB connection stringMongoDB 连接字符串中的数据库
【发布时间】:2020-06-01 18:50:51
【问题描述】:

在 MongoDB Nodejs 驱动程序中,我发现连接 URI 的含义有些混乱。

一方面,在描述 URI (https://docs.mongodb.com/manual/reference/connection-string/) 的页面中,它说路径参数是“身份验证数据库”。

另一方面,在许多官方示例 (http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html#mongoclient-connect) 中,他们似乎将路径参数用作要使用的活动数据库(他们直接调用 db.collection(),而不调用 .database()

我错过了什么吗?

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    TL;DR:
    连接后立即调用db.collection() 仅适用于低于 3.0 的驱动程序版本。

    详情:
    首先,您看到的官方示例来自1.4.9版本的MongoDB驱动程序,现在驱动程序版本为3.5.8,建议您查看最新的文档和示例here

    为了澄清混淆,连接 URI 中指定的数据库路径是身份验证数据库,即用于登录的数据库,即使对于 1.4.9 版本的驱动程序也是如此 - reference

    但是,您提到的差异的原因,即在某些情况下能够在连接后立即调用 db.collection() 是由于驱动程序版本 3 中 MongoClient 类的更改 - reference

    在版本 3 之前,MongoClient.connect 将向其回调函数返回一个 DB 实例,并且此实例将引用连接 URI 路径中指定的数据库,因此您可以立即调用 db.collection()

    MongoClient.connect("<connection_URI>", function(err, db) {
      // db is a DB instance, so I can access my collections straight away:
       db.collection('sample_collection').find();
    });
    

    但是,在版本 3 中进行了更新,MongoClient.connect 现在返回 MongoClient 实例,而不是 DB 实例 - reference

    MongoClient.connect("<connection_URI>", function(err, client) {
      // client is a MongoClient instance, you would have to call 
      // the Client.db() method to access your database
      const db = client.db('sample_database');
      // Now you can access your collections
      db.collection('sample_collection').find();
    });
    

    【讨论】:

    • 谢谢。那你打电话给close()?我看到客户端和数据库都有一个close API。
    • 对于版本 3(及更高版本),只有 MongoClient 类有 close 方法,因此您只能在客户端实例上调用 close。
    • 谢谢,我知道这是一个不同的问题,但是 (stackoverflow.com/questions/10656574/…) 根据您提到的 SDK 更改,接受的答案仍然有效吗?在服务器生命周期中只调用一次连接并关闭一次?
    • 是的,考虑到问题的上下文,该问题的已接受答案(在应用程序生命周期中仅连接一次)仍然有效。虽然这是一个架构决策,但您的用例最终应确定它是否对您有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多