Mongodb Scala案例类生成的字段值

Mongodb Scala案例类生成的字段值,mongodb,scala,scala-2.9,Mongodb,Scala,Scala 2.9,我有一个现有的Scala应用程序,它使用案例类,然后将这些案例类持久化到MongoDB中。我需要为case类引入一个新字段,但它的值是从现有字段派生的 例如,有一个电话号码,我想在保留原始电话号码的同时添加标准化的电话号码。我将更新MongoDB中的现有记录,但我需要将此规范化功能添加到现有的保存和更新代码中 那么,Scala中有没有什么好的快捷方式可以向case类的某个字段添加“钩子”?例如,在Java中,可以修改电话号码的设置器 编辑: Christian的答案中的解决方案单独运行良好,但在

我有一个现有的Scala应用程序,它使用案例类,然后将这些案例类持久化到MongoDB中。我需要为case类引入一个新字段,但它的值是从现有字段派生的

例如,有一个电话号码,我想在保留原始电话号码的同时添加标准化的电话号码。我将更新MongoDB中的现有记录,但我需要将此规范化功能添加到现有的保存和更新代码中

那么,Scala中有没有什么好的快捷方式可以向case类的某个字段添加“钩子”?例如,在Java中,可以修改电话号码的设置器

编辑:

Christian的答案中的解决方案单独运行良好,但在我的例子中,字段有默认值(我认为是因为Salat…)

如果使用类似于:
人(电话=一些人)


我将得到:
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)
  }
}