2011-01-19 23 views
15

Quiero usar MongoDB con Scala. Encontré 2 bibliotecas para eso.¿Qué biblioteca es la mejor para MongoDB con Scala?

  1. ascensor-mongo mongo
  2. -scala-controlador

Podría decirme, por favor, que la biblioteca es el mejor para usar? Y por favor dígame otro si lo sabe.

+0

¿Qué hay de ReactiveMongo? (http://reactivemongo.org/) –

Respuesta

24

Usted debe tomar una mirada cercana a Casbah, que es el funcionario (y totalmente compatible) MongoDB Scala conductor:

http://api.mongodb.org/scala/casbah/latest

Im ciertamente sesgada como el creador y mantenedor del proyecto, pero el apoyo oficial trae muchos beneficios, incluido el hecho de que hay un desarrollador de tiempo completo detrás de esto. Hay envolturas de conversión de tipo sólido integradas para los tipos comunes de Scala y las implementaciones de estilo de las colecciones Scala de DBObject, que son mucho mejores que los objetos Java predeterminados que usan muchos de los otros controladores. También hay una consulta completa dsl que se asigna a la sintaxis de la consulta de Mongo.

Me gustan las cosas de Lift también y recientemente comencé a trabajar con el equipo de Lift para ayudar a mejorarlo. Foursquare acaba de lanzar una consulta DSL para la elevación-mongo-disco llamado Rogue que impulsa su propio sistema Scala + MongoDB:

http://GitHub.com/foursquare/rogue

he encontrado la mayoría de la gente está utilizando ya sea levantar o Casbah, pero tu caso es distinto. Siéntase libre de hacerme ping si necesita más ayuda.

+0

Rogue parece abandonado: el último commit hace 6 meses. –

+0

@Brendan W. McAdams puede usar casbah para llamadas asincrónicas? – vdep

+4

¿Todavía se recomienda Casbah ahora? Desde el [sitio de mongodb] (https://docs.mongodb.com/ecosystem/drivers/scala/), se dice que Casbah es el controlador heredado de Scala para MongoDB. – null

5

Como usuario imparcial de Casbah desde hace un tiempo, digo, use Casbah con seguridad.

Comprobar que:

val mongo = MongoConnection() 
val coll = mongo("myDB")("myCollection") 
val builder = MongoDBObject.newBuilder 
builder += "username" -> "Janx" 
builder += "comment" -> "Casbah is cool!" 
coll += builder.result.asDBObject 

Eso es, por supuesto, sólo una muestra. Es muy refrescante de usar, especialmente si proviene del controlador de Java. Y como ahora es el controlador de Scala respaldado por 10Gen y el talentoso Sr. McAdams, es realmente una obviedad. ¡Aclamaciones!

3

Estábamos algo insatisfechos con la forma en que Casbah trabaja para objetos profundos o mapas simples y sin soporte de mapeo de clase real, así que lanzamos nuestro propio MongoDB Synchronous Scala driver sobre el controlador java heredado que me gustaría descaradamente conectar aquí con un ejemplo sobre cómo almacenar y recuperar un mapa y una clase de caso simple. El controlador no tiene mucha magia y es fácil de configurar y presenta una implementación simple de BSON que se inspiró en el Play2 JSON impl.

Aquí es cómo usarlo con algunos valores simples:

val client = MongoClient("hostname", 27017) 
val db = client("dbname") 
val coll = db("collectionname") 

coll.save(Bson.doc("_id" -> 1, "vals" -> Map("key1" -> "val1"))) 
val docOpt = coll.findOneById(1) // => Option[BsonDoc] 

for(doc <- docOpt) 
    println(doc.as[Map[String, String]]("vals")("key1")) // => prints "val1" 

Y con una clase de caso:

case class DnsRecord(host: String = "", ttl: Long = 0, otherProps: Map[String, String] = Map()) 

case object DnsRecord { 
    implicit object DnsRecordToBsonElement extends ToBsonElement[DnsRecord] { 
    def toBson(v: DnsRecord): BsonElement = DnsRecordToBsonDoc.toBson(v) 
    } 

    implicit object DnsRecordFromBsonElement extends FromBsonElement[DnsRecord] { 
    def fromBson(v: BsonElement): DnsRecord = DnsRecordFromBsonDoc.fromBson(v.asInstanceOf[BsonDoc]) 
    } 

    implicit object DnsRecordFromBsonDoc extends FromBsonDoc[DnsRecord] { 
    def fromBson(d: BsonDoc): DnsRecord = DnsRecord(
     d[String]("host"), 
     d[Long]("ttl"), 
     d[Map[String, String]]("op") 
    ) 
    } 

    implicit object DnsRecordToBsonDoc extends ToBsonDoc[DnsRecord] { 
    def toBson(m: DnsRecord): BsonDoc = Bson.doc(
     "host" -> m.host, 
     "ttl" -> m.ttl, 
     "op" -> m.otherProps 
    ) 
    } 
} 

coll.save(DnsRecord("test.de", 4456, Map("p2" -> "val1"))) 
for (r <- coll.findAs[DnsRecord](Bson.doc("host" -> "test.de"))) 
    println(r.host) 
Cuestiones relacionadas