我有問題完全如標題中所述。卡斯巴 - 參數查找或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
}
但是這是荒謬的......我想,我只是不明白的東西在這裏,請告訴我,我失去了什麼?
你的語法看起來很好 - 你可以從shell中發佈一些真實的數據,並查詢代碼嗎?當你說串接時,你的意思是在mongodb中的值是一個字符串? –
同意語法很好,或許關鍵/價值是問題? –
請參閱更新.. – noncom