Mongodb 添加新字段后,ReactiveMongo Macros.handler崩溃
我最近在scala case类中添加了一个新字段,因为我想在MongoDB中跟踪该字段 假设案例类是这样的:Mongodb 添加新字段后,ReactiveMongo Macros.handler崩溃,mongodb,scala,reactivemongo,play-reactivemongo,Mongodb,Scala,Reactivemongo,Play Reactivemongo,我最近在scala case类中添加了一个新字段,因为我想在MongoDB中跟踪该字段 假设案例类是这样的: case class MyItem ( var existingField: String, var newlyAddedField: String ) { } 我使用它将json和bson序列化/反序列化到我的对象: object MyItem { import play.api.libs.json.Json // generate reader and wr
case class MyItem (
var existingField: String,
var newlyAddedField: String
) {
}
我使用它将json和bson序列化/反序列化到我的对象:
object MyItem {
import play.api.libs.json.Json
// generate reader and writer:
implicit var jsonFormats = Json.format[MyItem]
implicit var bsonFormats = Macros.handler[MyItem]
}
由于我数据库中的所有现有数据都没有newlyAddedField
,因此我得到了运行时异常
reactivemongo.bson.exceptions.DocumentKeyNotFound: The key 'newlyAddedField' could not be found in this document or array
有人能帮忙吗?我读过关于编写自己的序列化/反序列化的文章,但我不确定如何做到这一点,因为我使用的是Play Framework,它的语法和执行方式在不同的版本中都是不同的。我希望有一种更简单的方法,因为在NoSQL db中添加字段应该很常见。顺便说一句,我正在使用play framework 2.5
提前谢谢 AFAIU it
Macros.handler
是null
安全的,即如果没有字段,它不会将值设置为null
。我认为Scala中最简单、最干净的修复方法是将新字段声明为Option[String]
,这样每个人(包括宏代码生成器)都会看到该字段可能不存在。这似乎也是它宏的原因。处理程序是null
-安全的,即如果没有字段,它不会将值设置为null
。我认为Scala中最简单、最干净的修复方法是将新字段声明为Option[String]
,这样每个人(包括宏代码生成器)都会看到该字段可能不存在。这似乎也是贝娄所说的,如果新添加的字段
可能缺失,它必须表示为选项
,而不是空
,这不是特定于ReactiveMongo的。正如贝娄所说的,如果新添加的字段
可能缺失,它必须表示为选项
,而不是空
,这不是特定于ReactiveMongo的。