MongoDB Casbah for Scala的编译错误

时间:2013-06-15 15:47:36

标签: mongodb scala casbah

我正在对Scala和Cashbah进行更新查询。当我写这个......

val query = MongoDBObject({"_id" -> uri.toString})

val update: DBObject =
  $set("uDate" -> new DateTime) ++
  $addToSet("appearsOn") $each(sourceToAppend:_*) ++
  $addToSet("hasElements") $each(elementsToAppend:_*) ++
  $addToSet("hasTriples") $each (triplesToAppend:_*)

OntologyDocument.dao.collection.update(query, update, upsert = true)

...它给我一个像这样的编译错误。但如果我这样写的话......

No implicit view available from Object{def $each(target: Array[Any]): com.mongodb.casbah.commons.Imports.DBObject; def $each(target: Any*): com.mongodb.casbah.commons.Imports.DBObject} => com.mongodb.casbah.commons.Imports.DBObject.

...然后它编译并成功运行。

val query = MongoDBObject({"_id" -> uri.toString})

val setOps1 = $addToSet("appearsOn") $each(sourceToAppend:_*)
val setOps2 = $addToSet("hasElements") $each(elementsToAppend:_*)
val setOps3 = $addToSet("hasTriples") $each (triplesToAppend:_*)

val update: DBObject = $set("uDate" -> new DateTime) ++ setOps1 ++ setOps2 ++ setOps3

OntologyDocument.dao.collection.update(query, update, upsert = true)

我没理解。

为什么第一个编译,或第二个编译?

我错过了Scala基础吗?

1 个答案:

答案 0 :(得分:0)

这是由于dsl的实现方式和$each的链接。核心问题是我不认为$ addToSet按预期合并::

val setOps1 = $addToSet("appearsOn") $each(sourceToAppend:_*)
val setOps2 = $addToSet("hasElements") $each(elementsToAppend:_*)
setOps1 ++ setOps2

DBObject = { "$addToSet" : { "hasElements" : { "$each" : [ "another" , "list"]}}}

似乎MongoDBObject ++没有递归合并。