2012-11-19 52 views
3

我使用卡斯巴2.9.2

我的MongoDB的模式是这样的:

[_id: “三角” 信息:颜色: “红色”,行:“薄“,UseID:”1“,SourceId:”2“]]

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

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" } ] ] 

然而,当我翻译成卡斯巴斯卡拉它并不:

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

第一个投诉(来自IntelliJ)是希望所有的''都是'',我觉得它是不正确的,但是为了调试我的义务,这使我想到了第二个错误:

“错误:无隐式视图可从(java.lang.String,java.lang.String)=> com.mongodb.casbah.query.Imports.DBObject。涉及默认参数的应用程序中发生错误。 “信息” $ {不_ $ {elemMatch”

所以我想,问题是,我甚至可以做我在卡斯巴在命令行中做更新?如果是这样,怎么样?

谢谢!

回答

1

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

而且这很可能是我的问题的一部分,因为我走了不同的路线,我没有得到一个机会来测试它:

“如果你真的觉得有必要使用++与DSL的混合和裸体匹配,我们提供了 - > Tuple对的附加支持。你应该先查询话务员通话:”

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