在Casbah的Mongo $ elemMatch

时间:2012-11-19 12:31:24

标签: scala mongodb intellij-idea casbah

我正在使用Casbah 2.9.2

我的mongodb架构如下:

[_id:“Triangle”,Info:[Color:“Red”,Line:“Thin”,UseID:“1”,SourceId:“2”]]

我希望能够编写一个更新行,首先检查_id,Color和Line是否唯一,如果是,则更新UseID和SourceID,否则创建一个新的“Info”条目。这让我得到了我想要的命令行:

db.shapes.update( { _id : 'Triangle', Info : { $not : { $elemMatch : { Color : 'Red', Line : 'Thick' } } } }, { $push : { Info : { Color : 'Red', Line : 'Thick', UseID : '2', SourceId : '3' } } }, true)

给我这个条目:

[ _id : "Triangle", Info : [ { Color : "Red", Line : "Thin", UseID : "1", SourceId : "2" }, { Color : "Red", Line : "Thick", UseID : "2", SourceId : "3" } ] ]

然而,当我为Scala翻译为Casbah时,它不会:

shapesCollection.update( { "_id" -> shape, "Info" $not { _ $elemMatch { "Color" -> color, "Line" -> line } } }, { $push -> { "Info" -> { "Color" -> color, "Line" -> line, "UseId" -> useId, "SourceId" -> srcId } } }, true )

第一个投诉(来自IntelliJ)是它想要所有','s',我觉得不正确,但为了调试我的责任,这让我第二个错误说:

“错误:没有(java.lang.String,java.lang.String)=> com.mongodb.casbah.query.Imports.DBObject提供的隐式视图。涉及默认参数的应用程序出错。” “$ not {_ $ elemMatch {”

所以我猜问题是,我是否可以通过Casbah的命令行进行更新?如果是这样,怎么样?

谢谢!

1 个答案:

答案 0 :(得分:1)

因此对于任何关心的人来说,首先我的更新字符串有点关闭,如果“颜色”和“行”不存在但是“_id”没有,则会抛出错误。基本上它看起来像$ push with upsetter,因为true不会添加到现有的“_id”,所以我在尝试添加条目时遇到重复的键错误。但是,这没有实际意义,我想要做的真正解决方案是不使用Casbah而是使用MongoDB Java驱动程序。然后我能够获得$ elemMatch来做我想做的事。

这也可能是我问题的一部分,因为我走了一条不同的路线,我没有机会测试它:

“如果你真的觉得需要使用混合了DSL和裸匹配的++,我们为 - >元组对提供附加支持。你应该首先调查运算符:”

val qMix = ("baz" -> 5) ++ ("foo" $gte 5) ++ ("x" -> "y")
/* error: value ++ is not a member of (java.lang.String, Int)
   val qMix = ("baz" -> 5) ++ ("foo" $gte 5) ++ ("x" -> "y") */

运算符被链接到DSL运算符的结果(顺便提交正确地返回DBObject):

val qMix = ("foo" $gte 5) ++ ("baz" -> 5) ++ ("x" -> "y")
/* qMix: com.mongodb.casbah.commons.Imports.DBObject =
   { "foo" : { "$gte" : 5} , "baz" : 5 , "x" : "y"} */

来自:http://api.mongodb.org/scala/casbah/current/tutorial.html