繁体   English   中英

ReactiveMongo:如何将列表反序列化为Option

[英]ReactiveMongo: How to deserialize a list into an Option

以下是代表用户的case类,其伴随对象提供了BSONDocumentWriterBSONDocumentReader来对BSON进行序列化/反序列化:

case class User(
  id: Option[BSONObjectID],
  name: String,
  addresses: Option[List[BSONObjectID]]
)

object User {
  implicit object UserWriter extends BSONDocumentWriter[User] {
    def write(user: User) = BSONDocument(
      "_id" -> user.id.getOrElse(BSONObjectID.generate),
      "name" -> user.name,
      "addresses" -> user.addresses
    ) 
  }

  implicit object UserReader extends BSONDocumentReader[User] {
    def read(doc: BSONDocument) = User(
      doc.getAs[BSONObjectID]("_id"),
      doc.getAs[String]("name").get,
      doc.getAs[List[BSONObjectID]]("addresses").toList.flatten,
    )
  }
}

上面的代码无法编译,因为User.addresses是一个Option并且我总是收到以下错误:

/home/j3d/Projects/test/app/models/User.scala:82: polymorphic expression cannot be instantiated to expected type;
[error]  found   : [B]List[B]
[error]  required: Option[List[reactivemongo.bson.BSONObjectID]]
[error]       doc.getAs[List[BSONObjectID]]("addresses").toList.flatten,
                                                                ^

如果输入的BSON包含addresses ,如何将其反序列化为Option[List[BSONObjectID]]

为什么要调用toList然后flatten 如果我正确地阅读了BSONDocument的文档,则getAs方法将返回类型TOption ,在这种情况下,您将T指定为List[BSONObjectID] 当你调用toList ,你基本上拆包Option到一个空List (在的情况下, None ),或者到实际List中的情况下Some 然后这里的flatten似乎没有做任何相关的事情。 您不能按以下方式进行操作吗?

doc.getAs[List[BSONObjectID]]("addresses")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM