我的问题与标题中描述的完全一样。
例如,如果我尝试:
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
对的结果......
我必须说密钥和值是有效的。但是,该值是数字,但是对于这些语句,它是字符串化的,因此应该没有问题。或者不是?
更新
在尝试捕获更精确描述问题所需的数据时,我已经运行了足以实现问题根源的测试。事实证明,Casbah不会留下“1”来保持String
,它会自动将其转换为Integer
,因此,将String与整数进行比较,肯定永远不会返回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 :(得分:0)
好的,最后我提出了某种解决方案。在我的情况下,值只能是AnyVal
的后代或java.lang.String
的后代。所以共同的父母将是Any
。这就是为什么我已将传递的value
类型更改为Any
:
def getObjectBy(key: String, value: Any) = {
// ...
}
确实有效! Doh,真是太容易了!我从未在Java中使用Object
或在Scala中使用Any
,并且认为它不会像那样工作......但是......