2012-06-05 4 views
0

제목에 설명 된 것과 똑같은 문제가 있습니다. 예를 들어카스바 - 파라 메트릭 찾기 또는 findOne은 거기에있는 것을 반환하지 않습니다.

, 내가하려고하면 :

val key = "myKey" 
    val value = "myVal" 

    val one = Option(collection.findOne(MongoDBObject(key -> value))) 
    val all = collection.find(MongoDBObject(key -> value)) 

후 나는 내용 및 확인 : 나는 MongoDBObject 매개 변수를 사용하지 않는 경우, 작동하지만

println(one)  => None 
    println(all.size) => 0 

를 - 그것은 모든 발견 거기있는 것들.

내가 뭘 잘못하고 있니? 나는 그 매개 변수 객체가 key-value 기준을 지정한다고 가정합니다. 검색 결과가 key-value 쌍을 포함하는 결과 만 반환하도록해야한다고 가정합니다.

그리고 그 키와 값이 유효하다고 말해야합니다. 그러나 값은 숫자이지만이 문에 대해 문자열로 표시되므로 아무런 문제가 없어야합니다. 안 그래요?

UPDATE : 문제의 원인을 실현하기 위해

문제의 더 precised 설명에 필요한 데이터를 캡처하는 중에, 내가 실행 한 테스트에 충분. Casbah가 String으로 유지되도록 "1"을 남기지 않고, 자동으로 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 

} 

을하지만 rediculous이다 : 좋아, 그래서 나는이 같은 문제를 해결 생각할 수 있는가?

+0

구문이 멋지게 보입니다. 쉘에서 실제 데이터를 쿼리 코드로 게시 할 수 있습니까? 당신이 문자열로 말할 때, 그 값이 mongodb의 문자열이라는 것을 의미합니까? –

+0

구문에 동의하면 키/값이 문제일까요? –

+0

업데이트를 참조하십시오 .. – noncom

답변

0

좋아, 결국 나는 일종의 해결책을 찾았다. 내 상황에서 값은 AnyVal 또는 매우 java.lang.String의 자손이어야합니다. 따라서 공통 부모는 Any입니다.

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

을 그리고 실제로 일 : 내가 왜 Any에 전달 된 value 유형을 변경 한 즉! Doh, 너무 쉬웠 어! Java에서 Object을 사용한 적이 없거나 스칼라에서 Any을 사용하지 않았고 그런 식으로 작동하지 않는다고 생각했지만 ...

관련 문제