2011-04-07 18 views
8

Estoy tratando de escribir una consulta para buscar por Object ID con Casbah, parece trivial pero ... no lo encuentro.CÓMO buscar por ID de objeto en MongoDB con Casbah?

yo probamos este:

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 
} 

y esto:

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 
    } 

Este compilar y ejecutar, pero sin resultado. También probé esto:

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 
} 

Pero éste no se compila porque la cadena no se puede convertir a OBJECTID.

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

Gracias por su ayuda :)

Respuesta

12

"_id" normalmente se almacena como un ID de objeto en MongoDB y no una cadena ... cadena de objeto y de diferentes tipos y no se puede convertir una cadena a una ObjectId. ObjectId es un tipo distinto dentro de MongoDB también, por lo que ObjectId ("abcdefgh123") NO es lo mismo que la cadena "abcdefgh123".

Necesita buscar por ObjectID aquí dentro de Casbah. Pruebe esto en su lugar:

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

Ok gracias @McAdams. ¡Ahora funciona! 'def get (id: Opción [String]): Usuario = { val MongoDB:. MongoDB = MongoConnection() se aplican ("test") val mongoColl: MongoCollection = mongoDB.apply ("usuarios") val objectId : ObjectId = new ObjectId (id.getOrElse(). AsInstanceOf [String]) val user = new User() val o: DBObject = MongoDBObject ("_ id" -> objectId) val u = mongoColl.findOne (o) para (x <- u) { user.id = x.getAs [String] ("_ id") user.fullname = x.getAs [String] ("nombre completo") user.username = x.getAs [ Cadena] ("nombre de usuario") } usuario } ' – Remy

+1

También puede hacer mongoColl.findOne (id.get) – David

Cuestiones relacionadas