我遇到的问题与标题中描述的完全一样。
例如,如果我尝试:
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
对的结果......
而且不得不说key和value都是有效的。但是,该值是数字的,但是对于这些语句来说是字符串化的,所以应该没问题。或不?
更新:
在尝试捕获更精确地描述问题所需的数据时,我已经运行了足以了解问题根源的测试。事实证明,Casbah 不会留下“1”来保持 a String
,它会自动将其转换为 a 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
}
但这太荒谬了……我想,我只是在这里没有得到什么,请告诉我,我错过了什么?