MongoDB 原始 java 连接

MongoDB raw java connection

我正在尝试创建一个通用的 mongo 连接组件,它将与不同的 mongo 数据库实例一起使用。我设法让它与一些代码一起工作 like:

  // Creating a Mongo client 
  MongoClient mongo = new MongoClient( "localhost" , 27017 ); 

  // Creating Credentials 
  MongoCredential credential; 
  credential = MongoCredential.createCredential("sampleUser", "myDb", 
     "password".toCharArray()); 
  System.out.println("Connected to the database successfully");  
  
  // Accessing the database 
  MongoDatabase database = mongo.getDatabase("myDb"); 
  System.out.println("Credentials ::"+ credential); 

我不明白为什么它需要在 2 个地方指定数据库:"myDb",一次在凭据中,一次是 getDatabase。不仅如此,在我的设置中,我还需要在 createCredential: "admin" 上指定一个不同的数据库才能工作。为什么凭据数据库与我要 运行 查询的不同?

当您更深入地检查代码时,您会发现以下令人信服的原因。

这里是所有验证者掉落的地方

private void authenticateAll(final InternalConnection internalConnection, final ConnectionDescription connectionDescription) {
        if (connectionDescription.getServerType() != ServerType.REPLICA_SET_ARBITER) {
            for (final Authenticator cur : authenticators) {
                cur.authenticate(internalConnection, connectionDescription);
            }
        }
    }

authenticators 包含凭据列表。有四种实现。

  1. 默认
  2. 原生
  3. x509
  4. sasl

"myDb", once in the credential - why

在这里指定的主要原因是,必须在哪个数据库上执行身份验证命令,因为每个数据库可以有不同的用户名。

executeCommand(getCredential().getSource(), authCommand, connection);

once while it does a getDatabase - why

完全不同。它 returns MongoDatabase 包含选项的对象 read, write concerns, list of collections, create view, create collection.