【问题标题】:Using Composite Keys with Salat and MongoDB在 Salat 和 MongoDB 中使用复合键
【发布时间】:2013-02-18 22:27:41
【问题描述】:

我刚刚阅读了this post,了解如何在 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](...)

谢谢。

【问题讨论】:

    标签: mongodb scala salat


    【解决方案1】:

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

    所以你需要做的是:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多