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

そして、私はキーと値が有効であると言わなければなりません。ただし、値は数値ですが、これらのステートメントでは文字列化されているため、問題はありません。か否か?

アップデート:

問題をより正確に説明するために必要なデータを取得しようとしながら、問題の原因を理解するのに十分なテストを実行しました。Casbahは「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

}

しかし、それはばかげています...私はここで何かを取得していないと思います、教えてください、私は何が欠けていますか?

4

1 に答える 1

0

さて、ついに私はある種の解決策を思いついた。私の状況では、値はの子孫AnyValまたは非常にのいずれかになりますjava.lang.String。したがって、共通の親はになりますAny。そのため、渡されたvalueタイプをAny次のように変更しました。

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

そしてそれは確かに機能しました!ああ、とても簡単でした!私はObjectJavaやAnyScalaで使用したことはなく、そのように機能するとは思いませんでした...しかし..

于 2012-06-09T16:58:57.903 に答える