我用的是Casbah 2.9.2
我的MongoDB架构如下:
[u id:“三角形”,info:[color:“红色”,line:“细线”,useid:“1”,sourceid:“2”]]
我希望能够编写一个更新行,首先检查id、颜色和行是否在一起是唯一的,如果是这样,则更新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)是它希望所有的','是',我觉得这是不正确的,但为了调试,我不得不,这带我到第二个错误说:
“错误:没有从(java. Lang.Stand,java. Lang.Stand)= .COM.MangoDb.CasBa.Que.Ipp.DbBoCube可用的隐式视图。涉及默认参数的应用程序出错。“信息“$不{
所以我想问题是,我能在casbah的命令行中完成更新吗?如果是,怎么做?
谢谢!

最佳答案

所以对于关心我的人来说,首先我的更新字符串有点不对劲,如果“color”和“line”不存在,但是“\u id”存在,它就会抛出错误。基本上看起来$push with upsetter as true并没有添加到现有的“\u id”,所以当它试图添加条目时,出现了重复的键错误。但是,这是个未知数,我想做的真正的解决方案是不使用CASBAH,而是使用MangGDB 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运算符的结果相关联(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

关于scala - 在Casbah的Mongo $ elemMatch,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13453893/

10-09 16:40