2012-11-19 83 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