Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用反应式mongo将案例类映射到mongodb文档_Mongodb_Scala_Playframework_Play Reactivemongo - Fatal编程技术网

使用反应式mongo将案例类映射到mongodb文档

使用反应式mongo将案例类映射到mongodb文档,mongodb,scala,playframework,play-reactivemongo,Mongodb,Scala,Playframework,Play Reactivemongo,下面是我的简单文档,它表示一个链接。我在scala中使用reactivemongo来实现这一点 我在编译过程中遇到以下错误: app/components/Link.scala:60:11:找不到类型的Json反序列化程序 组件链接。尝试为此实现隐式读取或格式 类型[错误].一个[链接][错误]^[错误]一个错误 发现 我在我的Link companion对象中创建了隐式,并将其导入到我的LinkRepo类中 我是否正确处理mongo文档id? 我是否应该使用字符串映射到文档ID,而不知道最佳做

下面是我的简单文档,它表示一个链接。我在scala中使用reactivemongo来实现这一点

我在编译过程中遇到以下错误:

app/components/Link.scala:60:11:找不到类型的Json反序列化程序 组件链接。尝试为此实现隐式读取或格式 类型[错误].一个[链接][错误]^[错误]一个错误 发现

我在我的Link companion对象中创建了隐式,并将其导入到我的LinkRepo类中

我是否正确处理mongo文档id?
我是否应该使用字符串映射到文档ID,而不知道最佳做法是什么?我必须在某个时候将字符串转换为BSONObjectID吗

package components

import javax.inject.Inject
import reactivemongo.bson._

import reactivemongo.api.ReadPreference
import reactivemongo.api.collections.bson.BSONCollection
import reactivemongo.bson.{ BSONDocument, BSONObjectID }
import reactivemongo.api.commands.{ UpdateWriteResult, WriteResult, Upserted }
import reactivemongo.api.commands.bson.BSONUpdateCommand._
import reactivemongo.api.commands.bson.BSONUpdateCommandImplicits._

case class Link(id: Link.ID,
                name: String,
                url: String)


object Link {

  type ID = String

  implicit val linkReader: BSONDocumentReader[Link] =
    BSONDocumentReader[Link] { doc: BSONDocument =>
      Link(
        doc.getAs[String]("id").getOrElse(""),
        doc.getAs[String]("name").getOrElse(""),
        doc.getAs[String]("url").getOrElse(""))
    }

  implicit val linkWriter: BSONDocumentWriter[Link] =
    BSONDocumentWriter[Link] { link: Link =>
      BSONDocument(
        "id" -> link.id,
        "name" -> link.name,
        "url" -> link.url)
    }

}

import scala.concurrent.{ ExecutionContext, Future }
import reactivemongo.bson.{ BSONDocument, BSONObjectID }

import reactivemongo.api.{ Cursor, ReadPreference }
import reactivemongo.api.commands.WriteResult

import reactivemongo.play.json._
import reactivemongo.play.json.collection.JSONCollection

import play.modules.reactivemongo.ReactiveMongoApi

class LinkRepo @Inject()(implicit ec: ExecutionContext, reactiveMongoApi: ReactiveMongoApi) {
  import Link._

  def linksCol: Future[JSONCollection] = reactiveMongoApi.database.map(_.collection("links"))

  def byId(id: Link.ID): Future[Option[Link]] = {
    linksCol.flatMap(_.find(
      selector = BSONDocument("_id" -> id),
      projection = Option.empty[BSONDocument])
      .one[Link])
  }



}
我的sbt有以下lib版本:

scalaVersion := "2.12.7"

libraryDependencies += guice
libraryDependencies ++= Seq(
  guice,
  "joda-time" % "joda-time" % "2.9.9",
  "net.ruippeixotog" %% "scala-scraper" % "2.1.0",
  "org.reactivemongo"      %% "play2-reactivemongo" % "0.16.0-play26",
  "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.2" % Test
)
插件:

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.20")

据我所知,您不需要使用BSONObjectID,但建议使用它。 但有一点需要注意,您应该在mongo中使用“\u id”字段,否则默认行为将是在创建新文档时在文档上创建一个\u id。。。因此,您的文档将具有_id和id

所以您应该从“\u id”中获取id,并将其写入“\u id”,即使您的case类是id

根据Handler,对于基本案例类,您可以使用其提供的宏:

implicit val linkHandler: BSONDocumentHandler[Link] = Macros.handler
这将为您的链接生成读写器

使用宏时,您可以使用一个注释来突出显示您的id,该注释将在mongo上显示为“\u id”:

import reactivemongo.bson.Macros.Annotations.Key

case class Link(
  @Key("_id")
  id: Link.ID,
  name: String,
  url: String
)

但是既然我在本例中有自己的处理程序,为什么它找不到隐式呢?我意识到您使用的是JSONCollection。。这是特定的游戏。。。我猜这会将BSON转换为JSON,因此您不会为这些文档提供JSON读取器。。。但不确定,因为我没有在play中使用reactiveMongo,所以我在akka http中使用它。。。很抱歉,您使用的是JSON集合,但提供的集合是BSON,因此,您需要确保从
ImplicitBSONHandlers
导入的转换是从
reactivemongo.play.json
导入的。我添加了
import reactivemongo.play.json.ImplicitBSONHandlers
import reactivemongo.play.json.
,但仍然会得到相同的错误。请检查versions@cchantep我将我的版本添加到我的问题我使用的是reactivemongo 0.16.0-play26。