Casbah中的Mongo $elemMatch

3
我正在使用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)是希望所有的 “,” 变成 “;”,但我认为这不正确。为了进行调试,我采纳了这个要求,这导致了第二个错误:
“错误:(java.lang.String, java.lang.String) => com.mongodb.casbah.query.Imports.DBObject 没有隐式视图可用。涉及默认参数的应用程序中发生了错误。“信息”$not { _ $elemMatch {"
所以我想问的是,我能否在 Casbah 的命令行中完成我的更新操作?如果可以,该怎么做呢?
谢谢!
1个回答

1

对于任何关心的人,首先我的更新字符串有点问题,如果“Color”和“Line”不存在但“_id”存在,则会引发错误。基本上看起来$push与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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接