我最近开始使用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(_))
它对我来说闻起来很像一个错误:该方法传递给collection.findOneByID()
一个Casbah驱动程序无法理解的MyCompositeId
类型的对象。我相信Salat应该在传递之前将此对象序列化为MongoDBObject。
我说错了吗?这是一个错误吗?或者有什么我想念的东西?
由于
答案 0 :(得分:1)
讨论这个Salat项目门票: https://github.com/novus/salat/issues/110
答案 1 :(得分:0)
事实证明,Salat并未正式支持复合键,或者只是部分支持它们。实际上,以下代码有效:
dao.insert(new MyObject(new MyCompositeId("some","key"), "my data")
即,使用复合键正确创建MongoDB中的记录:
db.coll.find()
{ "_id" : { "x" : "some", "y" : "key" }, "value" : "my data" }