Casbah - 参数化find或findOne不返回那里的东西

时间:2012-06-05 15:49:18

标签: mongodb casbah

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

例如,如果我尝试:

  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

}

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

1 个答案:

答案 0 :(得分:0)

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

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

确实有效! Doh,真是太容易了!我从未在Java中使用Object或在Scala中使用Any,并且认为它不会像那样工作......但是......