Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.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
Mongodb 将映射序列化为BSONDocument的Reactivemongo_Mongodb_Scala_Reactivemongo - Fatal编程技术网

Mongodb 将映射序列化为BSONDocument的Reactivemongo

Mongodb 将映射序列化为BSONDocument的Reactivemongo,mongodb,scala,reactivemongo,Mongodb,Scala,Reactivemongo,我定义了BSONDocumentWriters来将域对象(case类)映射到要使用ReactiveMongo驱动程序在MongoDB中持久化的BSON文档。对于案例类来说,定义编写者是非常简单的(尽管繁琐且容易出错:我希望有一个类似Salat的解决方案)。但是,对于映射[String,Any](其中的值可以是numeric、date或String类型),我似乎无法对其执行相同的操作。我找到了一个为地图定义通用编写器(和读取器)的: implicit def MapWriter[V](implic

我定义了
BSONDocumentWriter
s来将域对象(case类)映射到要使用ReactiveMongo驱动程序在MongoDB中持久化的BSON文档。对于案例类来说,定义编写者是非常简单的(尽管繁琐且容易出错:我希望有一个类似Salat的解决方案)。但是,对于
映射[String,Any]
(其中的值可以是numeric、date或String类型),我似乎无法对其执行相同的操作。我找到了一个为地图定义通用编写器(和读取器)的:

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)
  }
}
但如果类型
V
没有隐式的
BSONDocumentWriter
,即代码段:

BSONDocument(
  "_id" -> "asd",
  "map" -> MapWriter[Any].write(Map("x" -> 1, "y" -> "2"))
)
BSONDocument(
  "_id" -> "asd",
  "map" -> ValueMapWriter[Int].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"))
                      ^
could not find implicit value for parameter vw: reactivemongo.bson.BSONWriter[Int,reactivemongo.bson.BSONValue]
    "map" -> ValueMapWriter[Int].write(Map("x" -> 1, "y" -> 2))
                          ^
我想也许作者应该写一个
BSONValue
而不是
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" -> MapWriter[Any].write(Map("x" -> 1, "y" -> "2"))
)
BSONDocument(
  "_id" -> "asd",
  "map" -> ValueMapWriter[Int].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"))
                      ^
could not find implicit value for parameter vw: reactivemongo.bson.BSONWriter[Int,reactivemongo.bson.BSONValue]
    "map" -> ValueMapWriter[Int].write(Map("x" -> 1, "y" -> 2))
                          ^
如果上述方法有效,我可以使用一些基类作为值类型并定义其隐式编写器


我不知道为什么会发生这种情况,我如何才能解决它。也许我遗漏了一些明显的东西?Ideas?

ValueMapWriter定义中BSONValue的泛型类型参数边界不正确。如果你换线

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


implicit def ValueMapWriter[V](implicit vw:BSONWriter[V,u)没有测试它,因为不幸的是,我不再使用Scala,但它是有意义的。