0

我最近开始使用 Scala、Akka 和 MongoDB 的 Salat 序列化库。现在我正在尝试为看起来像这样的对象设置 SalatDAO:

import com.novus.salat.annotations._

case class MyObject(@Key("_id) compId: MyCompositeId, value: String)
case class MyCompositeId(x: String, y: String)

我创建了一个如下所示的 DAO:

import com.novus.salat.global._
import com.novus.salat.dao._
import com.mongodb.casbah.{MongoURI, MongoConnection}
import com.mongodb.casbah.commons.MongoDBObject

class MyObjectDAO(uri: String, db: String, coll: String) 
  extends SalatDAO[MyObject, MyCompositeId](MongoConnection(MongoURI(uri))(db)(coll))

最后我写了一个简单的单元测试:

val dao = new MyObjectDAO(...)

val id = new MyCompositeId("some","key)

// works fine
dao.findOne(MongoDBObject("_id.x" -> id.x, "_id.y" -> id.y))
// does NOT work
dao.findOneById(id)

第一个电话将返回Some(_),而第二个电话将返回None

现在我查看了源代码findOneById以尝试了解它为什么不起作用:

/** @param id identifier
 *  @return (Option[ObjectType]) Some() of the object found, 
 *          or <code>None</code> if no such object exists
 */
def findOneById(id: ID) =
  collection.findOneByID(id.asInstanceOf[AnyRef]).map(_grater.asObject(_))

对我来说,它闻起来很像一个错误:该方法正在传递给Casbah 驱动程序不理解collection.findOneByID()的类型的对象。MyCompositeId我相信 Salat 应该在传递它之前将此对象序列化为 MongoDBObject。

我对么?这是一个错误吗?还是我缺少什么?

谢谢

4

2 回答 2

1

关于这个 Salat 项目票的讨论: https ://github.com/novus/salat/issues/110

于 2013-11-21T16:54:26.447 回答
0

事实证明,Salat 没有正式支持复合键,或者更确切地说,它们只是部分支持。实际上,以下代码有效:

dao.insert(new MyObject(new MyCompositeId("some","key"), "my data")

即,将使用复合键正确创建 MongoDB 中的记录:

db.coll.find()
{ "_id" : { "x" : "some", "y" : "key" }, "value" : "my data" }
于 2013-11-21T16:19:00.507 回答