2012-06-05 26 views
0

我有問題完全如標題中所述。卡斯巴 - 參數查找或findOne不返回什麼

例如,如果我嘗試:

val key = "myKey" 
    val value = "myVal" 

    val one = Option(collection.findOne(MongoDBObject(key -> value))) 
    val all = collection.find(MongoDBObject(key -> value)) 

然後我檢查內容和:

println(one)  => None 
    println(all.size) => 0 

但是,如果我不使用MongoDBObject參數,它的工作原理 - 它發現所有的那裏有東西。

我在做什麼錯?我假設參數對象指定key-value標準,應使搜索只返回包含那些key-value對的結果...

而且我不得不說,密鑰和值是有效的。然而,這個值是數字的,但是在這些語句中它被串起來了,所以應該沒有問題。或不?

UPDATE:

雖然試圖捕捉必要對問題的一種高精度描述數據,我已經運行測試,足以認識到這個問題的根源。事實證明,Casbah不會將「1」保留爲String,它會自動將其轉換爲Integer,因此,將String與Integer進行比較,肯定不會返回true。好了,我能想到的解決這樣的問題:

def getObjectBy(key: String, value: String) = { 
    val all = collection.find() 
    val buffer = Buffer[DBObject]() 
    while(all.hasNext) { buffer += all.next } 
    val haveTheKey = buffer.filter(_.keySet.contains(key)) 

    if(haveTheKey.size > 0) { 
    val one = haveTheKey(0) 
    val v = one.get(key) 

    // 1st way (hell) 
    v match { 
     case i: Int => if(i == value.toInt) Some(one) 
     case s: String => if(s == value) Some(one) 
     case f: Float => if(s == value.toFloat) Some(one) 
     //... and so on.. 
     case _ => None 
    } 

    // 2nd way (better?) 
    if(v.toString == value) Some(one) else None 

    } else None 

} 

但是這是荒謬的......我想,我只是不明白的東西在這裏,請告訴我,我失去了什麼?

+0

你的語法看起來很好 - 你可以從shell中發佈一些真實的數據,並查詢代碼嗎?當你說串接時,你的意思是在mongodb中的值是一個字符串? –

+0

同意語法很好,或許關鍵/價值是問題? –

+0

請參閱更新.. – noncom

回答

0

好吧,最後我想出了一些解決方案。在我的情況下,價值只能是AnyValjava.lang.String的後代。所以共同的父母將是Any。這就是爲什麼我已經改變了傳遞value類型Any

def getObjectBy(key: String, value: Any) = { 
    // ... 
} 

,它確實工作!真的,太簡單了!我從來沒有在Java中使用Object或在Scala中使用Any,並且沒有想到它會這樣工作......但是..