MongoDB写入操作上的ConnectionNotInitialized异常

MongoDB写入操作上的ConnectionNotInitialized异常,mongodb,scala,reactivemongo,database,Mongodb,Scala,Reactivemongo,Database,我有两个Docker容器: 运行MongoDB 使用ReactiveMongo连接到所述MongoDB的服务 我用于连接MongoDB的代码: trait MongoHelper { this: BaseConfig => val dbKey: String val collKey: String lazy val mongoConfig = persistenceConfig.getConfig( dbKey ) lazy val servers = persist

我有两个Docker容器:

  • 运行MongoDB
  • 使用ReactiveMongo连接到所述MongoDB的服务
  • 我用于连接MongoDB的代码:

    trait MongoHelper {
      this: BaseConfig =>
    
      val dbKey: String
      val collKey: String
      lazy val mongoConfig = persistenceConfig.getConfig( dbKey )
      lazy val servers = persistenceConfig.getStringList( s"$dbKey.servers" ).asScala
      lazy val database = persistenceConfig.getString( s"$dbKey.database" )
      lazy val username = persistenceConfig.getString( s"$dbKey.username" )
      lazy val password = persistenceConfig.getString( s"$dbKey.password" )
      lazy val credentials = Seq( Authenticate( database, username, password ) )
    
    
      lazy val conOpts = MongoConnectionOptions( authSource = Some( database ), authMode = ScramSha1Authentication )
    
      lazy val driver = new MongoDriver
      lazy val connection = driver.connection( servers, authentications = credentials, options = conOpts )
    
      lazy val db = connection( database )
    
    }
    
    连接似乎很好,因为我可以毫无问题地从中读取。但是,当我尝试插入或更新文档时,我遇到了以下异常:

    reactivemongo.core.errors.ConnectionNotInitialized: MongoError['Connection is missing metadata (like protocol version, etc.) The connection pool is probably being initialized.']
    at reactivemongo.core.errors.ConnectionNotInitialized$.MissingMetadata(errors.scala:71)
    at reactivemongo.api.collections.GenericCollection$$anonfun$insert$1.apply(genericcollection.scala:338)
    at reactivemongo.api.collections.GenericCollection$$anonfun$insert$1.apply(genericcollection.scala:314)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
    at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
    at scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
    at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.pollAndExecAll(ForkJoinPool.java:1253)
    at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1346)
    at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
    

    但这对我来说毫无意义,连接池必须初始化,因为我正在使用它从数据库中读取数据。

    上次我这样做时,我与一个具有错误凭据的用户IIRC一起登录数据库。使用
    connection.database(…)
    而不是
    connection(…)
    (或其别名
    connection.DB(…)
    ,要有正确的DB分辨率。您应该有一个弃用警告。@Jean Philippellet非常感谢,这就成功了!我的Docker脚本应该创建用户,但显然他们没有被创建。。尽管我试图验证的用户不存在,但我仍然可以阅读,这很奇怪。错误消息不仅仅是误导性的。您应该有一个编译警告,指示
    .db
    已被弃用(由于其同步问题)。