【问题标题】:Getting error while trying to insert data into MongoDB尝试将数据插入 MongoDB 时出错
【发布时间】:2016-07-07 23:58:43
【问题描述】:

我正在尝试使用 Play-scala 和 ReactiveMongo 将数据插入 MongoDB。

这是我的DbimpService.scala

package services
import models.Post
import reactivemongo.bson.BSONDocument
import reactivemongo.api.MongoDriver
import reactivemongo.api.collections.bson.BSONCollection
import scala.concurrent.ExecutionContext
import javax.inject.Inject
import play.api.libs.json.Json
import reactivemongo.play.json.collection.JSONCollection
import reactivemongo.api.commands.WriteResult
import scala.concurrent.Future
import org.apache.xerces.util.DatatypeMessageFormatter

class Dbimpservice @Inject() (implicit ec:ExecutionContext) extends Dbservice {
    def create(p:Post):String={
            var status = "Not Saved"
                    val driver = new MongoDriver
                    val connection = driver.connection(List("localhost"))
                    val db = connection("application")
                    val collection = db[BSONCollection]("post")
                    val futureList = collection.insert[Post](p)
                    futureList.onComplete { case sucess => println(sucess) }
            return status
    }
}

这是我的HomeController.scala

package controllers

import javax.inject._
import play.api._
import play.api.mvc._
import models._
import scala.util.{ Failure, Success }
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import reactivemongo.api.{ MongoDriver, MongoConnection }
import reactivemongo.play.json.collection.JSONCollection
import reactivemongo.bson.BSONDocument
import reactivemongo.api.commands.WriteResult
import reactivemongo.api.collections.bson.BSONCollection
import play.api.libs.json.Json
import services.Dbservice
import services.Dbimpservice
import services.Dbservice
import scala.concurrent.ExecutionContext
import scala.concurrent.Await
import scala.concurrent.duration.Duration

/**
 * This controller creates an `Action` to handle HTTP requests to the
 * application's home page.
 */
@Singleton
class HomeController @Inject() (implicit ec:ExecutionContext,val Dbservice : Dbimpservice)extends Controller {

    /**
     * Create an Action to render an HTML page with a welcome message.
     * The configuration in the `routes` file means that this method
     * will be called when the application receives a `GET` request with
     * a path of `/`.
     */
  def index  = Action{
    Ok("Hai")
  }

    def read = Action.async {
      val query = BSONDocument()
                    val driver = new MongoDriver
                    val connection = driver.connection(List("localhost:27017"))
                    val db = connection("application")
                    val collection = db[BSONCollection]("post")
                    val futureList = collection.find(query).cursor[Post]().collect[List]()
                    futureList.map { list =>
              Ok(list.toString())
          }
    }

    def create = Action(BodyParsers.parse.json) { request => 
     val personResult = request.body.validate[Post]
    personResult.fold(
      errors => {
        BadRequest(Json.obj("status " ->"ERROR"))
      },
      valid = fun
    )
   }

    def fun:Post => Result= { post =>
      var ans = Dbservice.create(post)
      Ok(ans)
  }

}

我正在尝试插入数据但没有插入,我得到的错误是

Failure(reactivemongo.core.errors.ConnectionNotInitialized: MongoError['Connection is missing metadata (like protocol version, etc.) The connection pool is probably being initialized.'])

有人请帮帮我,我什至参考了链接

http://stackoverflow.com/questions/31456517/embedmongo-with-reactivemongo-process-does-not-exit

但没有得到

【问题讨论】:

  • 需要注明DB和lib的版本

标签: mongodb scala reactivemongo


【解决方案1】:

猜测您使用的是最新版本的 ReactiveMongo (0.11.7+),您使用的是 deprecated DB resolution 代码(connection(dbName) aka connection.apply(dbName)

See also

您需要使用异步解决方案,该解决方案受益于故障转移(处理可能的网络延迟/事件)。以下代码必须如此重构。

val db = connection("application")
val collection = db[BSONCollection]("post")
val futureList = collection.insert[Post](p)

使用新的DB resolution

for {
  db <- connection.database("application")
  collection = db("post")
  res <- collection.insert(p)
} yield res

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    相关资源
    最近更新 更多