我定义了BSONDocumentWriter
使用 ReactiveMongo 驱动程序将域对象(案例类)映射到要保存在 MongoDB 中的 BSON 文档。对于案例类来说,定义作者是非常简单的(尽管乏味且容易出错:我希望有一个类似礼拜的解决方案)。但是,我似乎无法为一个人做同样的事情Map[String,Any]
(其中值可以是数字、日期或字符串类型)。我找到了一个代码示例 https://github.com/ReactiveMongo/ReactiveMongo/blob/master/driver/samples/BSON.scala定义地图的通用编写器(和读取器):
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
对于类型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
代替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))
^
如果上述方法有效,我可以使用一些基类作为值类型并定义其隐式编写器。
我不确定为什么会发生这种情况以及如何解决它。也许我错过了一些明显的东西?有想法吗?