在mongo中创建可变地图的最佳方法是什么?

时间:2012-02-01 00:35:25

标签: mongodb lift

我需要User类包含一个字符串映射,我在api中看到了MongoMapField所以我使用它因为它似乎合适。这是我的代码:

class User private () extends ProtoAuthUser[User] with ObjectIdPk[User] {
  def meta = User

  object oauth extends MongoMapField[String, String]("") {
    def setToken(provider: String, token: String) {this.value += (provider -> token) }
    def getToken(value: String) = { 
      if(!this.value.isEmpty) Full(this.value.get(value) match {
        case Some(value) => value
        case None => ""
      })
      else Empty
    }
  }
}
在这种情况下,

setToken不起作用,因为MongoMapField是不可变的(根据我的假设),以下代码也不起作用:

def setToken(provider: String, token: String) { this.value = this.value + (provider -> token) }

有谁知道在mongo中创建/更新字符串映射的最佳方法是什么?它也附加到用户?

谢谢=)

1 个答案:

答案 0 :(得分:2)

在处理不可变数据结构时,您需要考虑用新值替换现有值而不是尝试修改现有值。

因此,要使代码正常工作,您需要将其更改为:

class User private () extends ProtoAuthUser[User] with ObjectIdPk[User] {
  def meta = User

  object oauth extends MongoMapField[String, String](this) {
    def setToken(provider: String, token: String) {
      this.set(this.value + (provider -> token))
    }
    def getToken(value: String): Box[String] = { 
      Box(this.value.get(value))
    }
  }
}