Scala 在MongoDB中使用Salat时,处理compsite密钥的最佳方法是什么?

Scala 在MongoDB中使用Salat时,处理compsite密钥的最佳方法是什么?,scala,mongodb,salat,Scala,Mongodb,Salat,我在MongoDB中使用Salat,并尝试将其转换为自然密钥,以避免数据库中出现重复。我使用的case类看起来有点像: case class Foo(someRelatedId: String, email: String ...) 我想添加一个由someRelatedId+电子邮件组成的自然键,并让MongoDB使用它而不是默认的ObjectId。从文档中我感觉这是可能的,但我仍在摸索一个可行的解决方案。我敢肯定,这在很大程度上是由于我对Scala本身不够熟练 更新:我现在有了一个有效的解决

我在MongoDB中使用Salat,并尝试将其转换为自然密钥,以避免数据库中出现重复。我使用的case类看起来有点像:

case class Foo(someRelatedId: String, email: String ...)
我想添加一个由someRelatedId+电子邮件组成的自然键,并让MongoDB使用它而不是默认的ObjectId。从文档中我感觉这是可能的,但我仍在摸索一个可行的解决方案。我敢肯定,这在很大程度上是由于我对Scala本身不够熟练

更新:我现在有了一个有效的解决方案,但我仍然想知道这是否是最好的方法

case class Foo(someRelatedId: String, email: String, naturalKey: String)

object Foo {
  def apply((someRelatedId: String, email: String) {
    apply(someRelatedId, email, someRelatedId+email)
  }
}
然后在package.scala中,我映射到:


这样我就避免了在我的域类中有一个强制性的(无意义的)id字段,但我必须在伴随对象上重载apply(),这似乎有点笨重。

这里是main Salat developer

按照Milan的建议,为复合密钥创建一个case类:

case class FooKey(someRelatedId: String, email: String)

case class Foo(@Key("_id") naturalKey: FooKey) {

  // use @Persist if you want these fields serialized verbatim to Mongo - see https://github.com/novus/salat/wiki/Annotations for details
  @Persist val email =  naturalKey.email
  @Persist val someRelatedId = naturalKey.someRelatedId

}

object FooDAO extends SalatDAO[Foo, FooKey](collection = /*  some Mongo coll */ )
如果您反对将“_id”作为字段名,则可以在上下文中使用全局覆盖将“_id”重新映射到“naturalKey”,或在每个对象上提供临时@Key覆盖

我个人不喜欢在您的模型中为_id赋予不同的名称,因为您的Mongo查询必须使用序列化键“_id”,而您的所有业务逻辑必须使用case类字段名(“naturalKey”或其他名称),但是YMMV


另外,我们的邮件列表位于-我会比堆栈溢出更快地看到您的问题。

如果您创建另一个val作为someRelatedId+电子邮件,并用@Key(_id))对其进行注释,如果您不需要将@Ignore放在someRelatedId上,则它肯定会起作用,但我不喜欢我的域中特定于框架的注释。不过,我确实喜欢将结构保留在复合键中,我想这值得更多的深夜黑客攻击。对不起,刚才看到了这个。您可以通过在
上下文中添加每类或全局覆盖来避免注释。这种方法唯一的缺点是,由于对象没有显式注释,任何进行查询的人都需要了解
上下文中有覆盖。例如,我认为许多团体在全球范围内将
\u id
覆盖到
id
case class FooKey(someRelatedId: String, email: String)

case class Foo(@Key("_id") naturalKey: FooKey) {

  // use @Persist if you want these fields serialized verbatim to Mongo - see https://github.com/novus/salat/wiki/Annotations for details
  @Persist val email =  naturalKey.email
  @Persist val someRelatedId = naturalKey.someRelatedId

}

object FooDAO extends SalatDAO[Foo, FooKey](collection = /*  some Mongo coll */ )