Какой лучший способ создать изменчивую карту в Монго? - PullRequest
0 голосов
/ 01 февраля 2012

Мне нужно, чтобы класс User содержал карту строк, и я увидел MongoMapField в API, поэтому я использовал его, потому что он показался подходящим. Вот мой код:

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) }

Кто-нибудь знает, как лучше всего создать / обновить карту строк в монго, которая также прикреплена к пользователю?

Спасибо =)

1 Ответ

2 голосов
/ 02 февраля 2012

При работе с неизменяемыми структурами данных вам нужно думать о замене существующего значения новым значением, а не пытаться изменить существующее значение.

Итак, чтобы ваш код заработал, вам нужно изменить его на:

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))
    }
  }
}
...