2013-02-18 34 views
1

我剛剛閱讀了this post關於如何將複合鍵與Salat和MongoDB一起使用......並且它或多或少都很清楚它是如何工作的。不過,我想知道是否@Key註釋是強制性的,即使我的密鑰已經命名爲id。我試圖序列化來自外部庫的幾個case類,我不想重新定義它們。給出下面的外部殼體的類:在Salat和MongoDB中使用複合鍵

case class UserId(id: String, mail: String) 
case class User(id: UserId, name: String, surname: String) 

纔有可能序列化一個User對象像這樣(即,沒有@Key註釋)?

object UserDAO extends SalatDAO[User, UserId](...) 

謝謝。

回答

1

MongoDB希望集合中的每個文檔都有一個名爲「_id」的id字段。如果你沒有提供「_id」字段,那麼mongo-java-driver會爲你創建一個。

所以,你需要做的是兩種:

  • 名稱字段「_id」,而不是「ID」
  • 使用@Key註釋重新映射你的「ID」字段爲「_id」當User是系列化
  • 「ID」的全局密鑰重新映射添加到「_id」所以,這是沒有必要的地方使用@Key

當與外部的M處理odel,選項三是最有效的。參看「全球大重映」這個wiki文章: https://github.com/novus/salat/wiki/CustomContext

一旦您完成了此重映射,UserDAO能很好地工作的複合鍵。

請記住,即使你的領域是在User情況下類名爲「ID」,查詢必須_id,因爲這是場被稱爲你的MongoDB的文件內。

另外,請記住,當您使用複合鍵時,您將需要創建一個自定義索引,其中包含您要爲其查詢的訂單的複合關鍵字的所有字段。您可以使用Dex分析您的MongoDB日誌並提出建議: https://github.com/mongolab/dex