2011-04-07 5 views
8

나는 Casbah와 Object ID로 찾기 위해 쿼리를 작성하려고하는데, 사소한 것 같지만 ... 찾지 못합니다.Casbah와 함께 MongoDB에서 객체 ID로 찾는 방법은 무엇입니까?

def get(id: Option[String]): User = { 
    val mongoDB : MongoDB = MongoConnection().apply("test") 
    val mongoColl : MongoCollection = mongoDB.apply("users") 
    val objectId = id.getOrElse().asInstanceOf[String] 
    val o : DBObject = MongoDBObject("_id" -> objectId) 
    val u = mongoColl.findOne(o) 
    val user = new User() 
    for(x <- u){ 
     user.id = x.getAs[String]("_id") 
     user.username = x.getAs[String]("username") 
     user.password = x.getAs[String]("password") 
    } 
    user 
} 

이 :

def get(id: Option[String]): User = { 
     val mongoDB : MongoDB = MongoConnection().apply("test") 
     val mongoColl : MongoCollection = mongoDB.apply("users") 
     val objectId = "ObjectId(\"" +id.getOrElse().asInstanceOf[String] + "\")" 
     val o : DBObject = MongoDBObject("_id" -> objectId) 
     val u = mongoColl.findOne(o) 
     val user = new User() 
     for(x <- u){ 
      user.id = x.getAs[String]("_id") 
      user.username = x.getAs[String]("username") 
      user.password = x.getAs[String]("password") 
     } 
     user 
    } 

이 컴파일하고 실행하지만 결과

나는이 시도. 나는 또한이 시도 :

def get(id: Option[String]): User = { 
    val mongoDB : MongoDB = MongoConnection().apply("test") 
    val mongoColl : MongoCollection = mongoDB.apply("users") 
    val objectId : ObjectId = id.getOrElse().asInstanceOf[ObjectId] 
    val o : DBObject = MongoDBObject("_id" -> objectId) 
    val u = mongoColl.findOne(o) 
    val user = new User() 
    for(x <- u){ 
     user.id = x.getAs[String]("_id") 
     user.username = x.getAs[String]("username") 
     user.password = x.getAs[String]("password") 
    } 
    user 
} 

을하지만 문자열이 ObjectId가에 캐스트 할 수 없기 때문에이 하나가 컴파일되지 않습니다.

java.lang.ClassCastException: java.lang.String cannot be cast to org.bson.types.ObjectId 

당신의 도움 :) 주셔서 감사합니다

답변

12

"_id"일반적으로 MongoDB를에 OBJECTID로 저장이 아닌 문자열 ... 문자열 및 OBJECTID는 다른 유형이고, 당신은 문자열을 캐스팅 할 수있다 ObjectId. ObjectId는 MongoDB의 고유 한 유형이므로 ObjectId ("abcdefgh123")는 "abcdefgh123"문자열과 다릅니다.

여기 Casbah 내에서 ObjectID로 검색해야합니다. 대신 다음을 시도하십시오.

def get(id: Option[ObjectId]): User = { 
    val mongoDB : MongoDB = MongoConnection().apply("test") 
    val mongoColl : MongoCollection = mongoDB.apply("users") 
    val objectId : ObjectId = id.getOrElse().asInstanceOf[ObjectId] 
    id.foreach(oid => { 
     val o : DBObject = MongoDBObject("_id" -> oid) 
     val u = mongoColl.findOne(o) 
     val user = new User() 
     for(x <- u){ 
     user.id = x.getAs[ObjectId]("_id") 
     user.username = x.getAs[String]("username") 
     user.password = x.getAs[String]("password") 
     } 
     user 
    }) 
    } 
+1

감사합니다. @McAdams. 이제 작동합니다! . 사용자 = { 발 MongoDB를 : 는'데프 (: 옵션 [문자열] ID)를 얻을 MongoDB를 = MongoConnection()을 적용 ("테스트") 발 mongoColl : MongoCollection = mongoDB.apply ("사용자") 발 OBJECTID : ObjectId = new ObjectId (id.getOrElse(). asInstanceOf [문자열]) val user = new User() val o : DBObject = MongoDBObject ("_ id"-> objectId) val u = mongoColl.findOne (o) for (x <- u) { user.id = x.getAs [문자열] ("_ id") user.fullname = x.getAs [문자열] ("전체 이름") user.username = x.getAs [ 문자열] ("사용자 이름") } 사용자 } ' – Remy

+1

mongoColl.findOne (id.get)을 수행하십시오. – David

관련 문제