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 в Скале, и не думал, что так будет работать... но..

Другие вопросы по тегам