0

我遇到的问题与标题中描述的完全一样。

例如,如果我尝试:

  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

}

但这太荒谬了……我想,我只是在这里没有得到什么,请告诉我,我错过了什么?

4

1 回答 1

0

好的,最后我想出了某种解决方案。在我的情况下,值只能是后裔AnyVal或非常java.lang.String。所以共同的父母将是Any。这就是为什么我将传递的value类型更改为Any

def getObjectBy(key: String, value: Any) = {
  // ...
}

它确实有效!哦,这太容易了!我从未Object在 Java 或AnyScala 中使用过,并且不认为它会那样工作......但是......

于 2012-06-09T16:58:57.903 回答