Casbah - параметрическая находка или 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
пар...
И я должен сказать, что ключ и значение действительны. Значение, однако, является числовым, но в нем приведено строковое значение для этих операторов, поэтому проблем не должно быть. Или нет?
ОБНОВИТЬ:
Пытаясь собрать данные, необходимые для более точного описания проблемы, я запустил тесты, достаточные для того, чтобы понять причину проблемы. Оказывается, Касба не оставляет "1", чтобы остаться 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
}
но это смешно... я полагаю, что я просто ничего не понимаю здесь, пожалуйста, скажите мне, что мне не хватает?
1 ответ
Хорошо, наконец я нашел какое-то решение. В моей ситуации ценности могут быть только потомками AnyVal
или очень java.lang.String
, Таким образом, общий родитель будет Any
, Вот почему я изменил пройденное value
введите в Any
:
def getObjectBy(key: String, value: Any) = {
// ...
}
и это действительно сработало! До, это было так легко! Я никогда не пользовалась Object
на Java или Any
в Скале, и не думал, что так будет работать... но..