使用Salat和MongoDB的复合键

时间:2013-02-18 10:30:28

标签: mongodb scala salat

我刚刚阅读了this post关于如何将复合键与Salat和MongoDB一起使用的信息......它或多或少地清楚它是如何工作的。不过,我想知道即使我的密钥已经命名为@Keyid注释是否是强制性的。我正在尝试序列化来自外部库的一些案例类,我宁愿不重新定义它们。给出以下外部案例类:

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 个答案:

答案 0 :(得分:1)

MongoDB希望集合中的每个文档都有一个名为“_id”的id字段。如果您未能提供“_id”字段,那么mongo-java-driver将为您创建一个。

所以你需要做的是:

  • 将字段命名为“_id”,而不是“id”
  • 使用@Key注释在序列化User时将“id”字段重新映射为“_id”
  • 将“id”的全局密钥重新映射添加到“_id”,这样就无需使用@Key

在处理外部模型时,选项3是最有效的。请参阅此Wiki文章中的“全局密钥重映射”部分: https://github.com/novus/salat/wiki/CustomContext

完成此重新映射后,UserDAO应该可以正常使用复合键。

请记住,即使您的字段在User案例类中被命名为“id”,查询也必须引用_id,因为这是您在字段中调用的字段MongoDB文档。

另外,请记住,当您使用复合键时,您需要创建一个自定义索引,该索引将覆盖您要查询的顺序中的复合键的所有字段对他们来说您可以使用Dex分析MongoDB日志并提出建议: https://github.com/mongolab/dex