2012-02-01 45 views
0

我需要用戶類包含字符串的地圖,我在api中看到了MongoMapField,所以我使用它,因爲它看起來合適。這裏是我的代碼:在mongo中創建可變映射的最佳方式是什麼?

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中附加到用戶的字符串映射的最佳方法是什麼?

感謝=)

回答

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

這個工作只是完美!謝謝!只需將MongoMapField [String,String]修改爲MongoMapField [User,String]即可。如果我要使用OauthInfo是案例類的MongoMapField [User,OauthInfo],該怎麼辦?它似乎工作正常,但是當我User.currentUser.open _ !.保存時,它不保存。你知道這是爲什麼嗎? – user646658 2012-02-02 21:31:03

+0

MongoMapField不支持大小寫類。不過,您可以通過覆蓋asDBObject和fromDBObject函數來使其工作。 – 2012-02-03 10:20:40

相關問題