2

BSONDocumentWriterドメイン オブジェクト (ケース クラス) を BSON ドキュメントにマップし、ReactiveMongo ドライバーを使用して MongoDB で永続化するように sを定義しました。ライターの定義は、ケース クラスの場合は非常に簡単です (ただし、面倒でエラーが発生しやすい: そのための Salat のような解決策があればいいのにと思います)。ただし、 a に対して同じことを行うことはできないようですMap[String,Any](値は数値、日付、または文字列型にすることができます)。マップのジェネリック ライター (およびリーダー) を定義するコード例を見つけました。

implicit def MapWriter[V](implicit vw: BSONDocumentWriter[V]): BSONDocumentWriter[Map[String, V]] = 
  new BSONDocumentWriter[Map[String, V]] {
  def write(map: Map[String, V]): BSONDocument = {
    val elements = map.toStream.map { tuple =>
      tuple._1 -> vw.write(tuple._2)
    }
    BSONDocument(elements)
  }
}

BSONDocumentWriterしかし、 type V、つまりスニペットに暗黙的なものがない場合、これは機能しません:

BSONDocument(
  "_id" -> "asd",
  "map" -> MapWriter[Any].write(Map("x" -> 1, "y" -> "2"))
)

コンパイルしません:

could not find implicit value for parameter vw: reactivemongo.bson.BSONDocumentWriter[Any]
    "map" -> MapWriter[Any].write(Map("x" -> 1, "y" -> "2"))
                      ^

BSONValueライターは aではなくa に書き込む必要があるのではないかと考えたBSONDocumentので、次のように例を変更しました。

implicit def ValueMapWriter[V](implicit vw: BSONWriter[V, BSONValue]): BSONDocumentWriter[Map[String, V]] = 
  new BSONDocumentWriter[Map[String, V]] {
  def write(map: Map[String, V]): BSONDocument = {
    val elements = map.toStream.map {
      tuple =>
        tuple._1 -> vw.write(tuple._2)
    }
    BSONDocument(elements)
  }
}

物事を単純にするためIntに、値の型として使用しようとしましたが、スニペット:

BSONDocument(
  "_id" -> "asd",
  "map" -> ValueMapWriter[Int].write(Map("x" -> 1, "y" -> 2))
)

コンパイルしません:

could not find implicit value for parameter vw: reactivemongo.bson.BSONWriter[Int,reactivemongo.bson.BSONValue]
    "map" -> ValueMapWriter[Int].write(Map("x" -> 1, "y" -> 2))
                          ^

上記が機能した場合、値の型としていくつかの基本クラスを使用し、その暗黙的なライターを定義できたはずです。

なぜこれが起こっているのか、どうすれば解決できるのかわかりません。多分私は明らかな何かを見逃していますか?アイデア?

4

1 に答える 1

1

ValueMapWriter定義のBSONValueのジェネリック型パラメーター境界が正しくありません。ラインを変えると

implicit def ValueMapWriter[V](implicit vw: BSONWriter[V, BSONValue]): BSONDocumentWriter[Map[String, V]] =

implicit def ValueMapWriter[V](implicit vw: BSONWriter[V, _ <: BSONValue]): BSONDocumentWriter[Map[String, V]] =

次に、Int の暗黙のライターを解決する必要があります。

ところでsimple-reactivemongoはすでにこれを行っています。また、この機能をReactiveMongo Extensionsに追加する予定です。

于 2014-05-03T21:08:50.200 に答える