Mongodb Scala案例类生成的字段值
我有一个现有的Scala应用程序,它使用案例类,然后将这些案例类持久化到MongoDB中。我需要为case类引入一个新字段,但它的值是从现有字段派生的 例如,有一个电话号码,我想在保留原始电话号码的同时添加标准化的电话号码。我将更新MongoDB中的现有记录,但我需要将此规范化功能添加到现有的保存和更新代码中 那么,Scala中有没有什么好的快捷方式可以向case类的某个字段添加“钩子”?例如,在Java中,可以修改电话号码的设置器 编辑: Christian的答案中的解决方案单独运行良好,但在我的例子中,字段有默认值(我认为是因为Salat…) 如果使用类似于:Mongodb Scala案例类生成的字段值,mongodb,scala,scala-2.9,Mongodb,Scala,Scala 2.9,我有一个现有的Scala应用程序,它使用案例类,然后将这些案例类持久化到MongoDB中。我需要为case类引入一个新字段,但它的值是从现有字段派生的 例如,有一个电话号码,我想在保留原始电话号码的同时添加标准化的电话号码。我将更新MongoDB中的现有记录,但我需要将此规范化功能添加到现有的保存和更新代码中 那么,Scala中有没有什么好的快捷方式可以向case类的某个字段添加“钩子”?例如,在Java中,可以修改电话号码的设置器 编辑: Christian的答案中的解决方案单独运行良好,但在
人(电话=一些人)
我将得到:
Person=Person(a,一些,无)
您可以向case类添加方法,该类将包含来自现有字段的转换逻辑。例如:
case class Person(name: String, phone: String) {
def normalizedPhone = "+40" + phone
}
然后,您可以像使用字段一样使用该方法:
val p1 = new Person("Joe", "7234")
println(p1.normalizedPhone) // +407234
您可以在伴生对象中定义应用方法:
case class Person(name: String, phone: String, normalizedPhone: String)
object Person {
def apply(name: String, phone: String): Person = Person(name, phone, "xxx" + phone)
}
然后,在repl中:
scala> Person("name", "phone")
res3: Person = Person(name,phone,xxxphone)
我想这已经接近你需要的了。由于无法重写生成的mutator,请在现有字段前面加下划线,使其成为私有字段,然后为原始字段名编写访问器和mutator方法。之后,您只需要在构造函数中增加一行,以适应基于构造函数的字段初始化
case class Test(private var _phoneNumber: String, var formatted: String = "") {
phoneNumber_=(_phoneNumber)
def phoneNumber = _phoneNumber
def phoneNumber_=(phoneNumber: String) {
_phoneNumber = phoneNumber
formatted = "formatted" + phoneNumber
}
}
object Test {
def main(args: Array[String]) {
var t = Test("09048751234")
println(t.phoneNumber)
println(t.formatted)
t.phoneNumber = "08068745963"
println(t.phoneNumber)
println(t.formatted)
}
}
在我的例子中,我认为我必须将它作为一个单独的字段来保存在MongoDB中,但是如果它总是从另一个字段派生出来,为什么还要保存它呢?这不是冗余吗?它应该在数据库中,以便索引和快速查询。MongoDB的regexp查询不够快。这回答了我最初的问题。我最终采用了完全不同的解决方案,在适当的位置对场进行归一化,而根本不引入新的解决方案。
case class Test(private var _phoneNumber: String, var formatted: String = "") {
phoneNumber_=(_phoneNumber)
def phoneNumber = _phoneNumber
def phoneNumber_=(phoneNumber: String) {
_phoneNumber = phoneNumber
formatted = "formatted" + phoneNumber
}
}
object Test {
def main(args: Array[String]) {
var t = Test("09048751234")
println(t.phoneNumber)
println(t.formatted)
t.phoneNumber = "08068745963"
println(t.phoneNumber)
println(t.formatted)
}
}