2012-05-06 14 views
7

Ok, esta es otra pregunta sobre los conceptos básicos de Casbah y MongoDB. Después de haber recuperado un DBObject de la base de datos, ¿cómo puedo extraer ciertos datos de él? Sé que existe el método DBObject.get(), que devuelve java.lang.Object. ¿Tengo que hacerlo así y luego simplemente enviar los datos al tipo necesario? No estoy seguro de que esta sea la mejor manera de hacerlo ... ¿alguien puede recomendarme cómo hacerlo mejor?Controlador Casbah Scala MongoDB: obtención de datos de un DBObject

ACTUALIZACIÓN:

Finalmente fuimos el camino de la manipulación manual de todas las cosas. No utilizo Salat debido a la limitación de la clase de caso porque las clases de casos no se recomiendan para tener hijos y eso requeriría una reorganización arquitectónica. Sin embargo, la respuesta está marcada como la mejor respuesta, ya que funcionaría en la mayoría de las situaciones y no hay otra respuesta más general aquí.

Respuesta

11

Puede utilizar el método de MongoDBObject as para obtener el valor y echarlo en una llamada:

val coll = MongoConnection()(dbName)(collName) 
val query = MongoDBObject("title" -> "some value") 
val obj = coll findOne query 

val someStr = obj.as[String]("title") 
val someInt = obj.as[Int]("count") 
// and so on.. 

Tenga en cuenta que as una excepción si la clave dada no se puede encontrar. Es posible utilizar getAs que le da Option[A]:

listas
obj.getAs[String]("title") match { 
    case Some(someStr) => ... 
    case None => ... 
} 

de extracción es un poco más complicado:

val myListOfInts = 
    (List() ++ obj("nums").asInstanceOf[BasicDBList]) map { _.asInstanceOf[Int] } 

me escribió un ayudante, que hace que el uso casbah más consice, puede ser que será útil, así que ato:

package utils 

import com.mongodb.casbah.Imports._ 

class DBObjectHelper(underlying: DBObject) { 

    def asString(key: String) = underlying.as[String](key) 

    def asDouble(key: String) = underlying.as[Double](key) 

    def asInt(key: String) = underlying.as[Int](key) 

    def asList[A](key: String) = 
    (List() ++ underlying(key).asInstanceOf[BasicDBList]) map { _.asInstanceOf[A] } 

    def asDoubleList(key: String) = asList[Double](key) 
} 

object DBObjectHelper { 

    implicit def toDBObjectHelper(obj: DBObject) = new DBObjectHelper(obj) 

} 

Usted puede utilizar ayudante de la siguiente manera:

val someStr = obj asString "title" 
val someInt = obj asInt "count" 
val myDoubleList = obj asDoubleList "coords" 

Espero que te ayude.

+0

Wow que cubre el tema muy bien! Gracias, obviamente esta es ahora elegida como la mejor respuesta. – noncom

+0

Obtengo 'value getAs no es miembro de la opción [coll.T]' al llamar a 'val obj = coll.findOne (query); val str = obj.getAs [String] ("myValue") '. –

+0

El ejemplo no funciona, 'findOne' devuelve un tipo' Option'. – andyczerwonka

2

Si no tiene miedo de usar dependencias adicionales, use Salat. Con Salat es realmente simple lanzar clases de casos al objeto de la base de datos y viceversa.

serialización

val dbo = grater[Company].asDBObject(company) 

deserialización

val company_* = grater[Company].asObject(dbo) 
+0

Sí, sé acerca de Salat ... no tiene miedo de usar dependencias, pero algunos problemas pueden ser presentados por la única clase de solicitud de requriement. Si no habrá otra respuesta significativa, tendré que buscar en Salat entonces ... pero las clases de casos pueden plantear alguna necesidad para cambiar la arquitectura. – noncom

+0

No funciona con Scala 2.10 – expert

Cuestiones relacionadas