2013-02-18 36 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