1

我刚刚阅读了这篇关于如何在 Salat 和 MongoDB 中使用复合键的帖子……它或多或少地清楚它是如何工作的。不过,我想知道@Key即使我的密钥已经命名,注释是否是强制性的id。我正在尝试序列化来自外部库的一些案例类,我不想重新定义它们。给定以下外部案例类:

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

是否可以序列化这样的User对象(即没有@Key注释)?

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

谢谢。

4

1 回答 1

1

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

所以你需要做的是:

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

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

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

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

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

于 2013-02-18T14:27:41.190 回答