0

下面是一个代表用户的案例类,它的伴生对象提供了一个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]]

4

1 回答 1

1

你为什么打电话toList然后flatten?如果我正确阅读了 for 的文档BSONDocument,该getAs方法将返回一个Optionfor 类型T,在您的情况下,您指定TList[BSONObjectID]. 当您调用 时toList,您基本上是将 解包为Option空的List(在 a 的情况下None)或在 a 的情况下解压缩为实际ListSome。然后flatten这里似乎没有做任何相关的事情。你不能这样做:

doc.getAs[List[BSONObjectID]]("addresses")
于 2014-01-01T17:46:41.143 回答