2010-11-03 3 views

Répondre

1

J'ai utilisé casbah http://api.mongodb.org/scala/casbah/2.0.2/index.html pour parler à mongodb de mon application scala swing.

Il est assez facile à installer et à configurer, et l'API est assez scala-esque.

La partie la plus difficile est de comprendre mongodb lui-même, (provenant d'un arrière-plan sql)

+0

Oui, Casbah fonctionne très bien. En plus de cela, vous pouvez utiliser Salat qui rend la lecture/écriture des objets imbriqués à la base de données assez indolore Voir https://github.com/novus/salat et http://repo.novus.com/salat-presentation/#0 Casbah et salat ont google groupes http://groups.google.com/group/mongodb-casbah-users/topics et http://groups.google.com/group/scala-salat. Aussi une bonne discussion ici http://skillsmatter.com/podcast/scala/mongodb-jvm – foolshat

0

Nous étions en quelque sorte pas satisfait de la façon dont casbah fonctionne pour les objets profonds ou des cartes simples et aucun cas réel support de mapping de classe pour que nous roulions notre propre MongoDB Synchronous Scala driver sur le pilote java hérité que je voudrais sans vergogne brancher ici avec un exemple sur la façon de stocker et de récupérer une carte et une classe de cas simple. Le pilote n'a pas beaucoup de magie et est facile à installer et dispose d'une implémentation simple BSON qui a été inspiré par le Play2 JSON impl.

Voici comment l'utiliser avec des valeurs 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" 

Pour une classe de cas, il est un peu plus complexe, mais il est tout Roulotté main et il n'y a pas de magie pour que vous puissiez faire tout ce que vous comme et comment vous en avez besoin, ce fournisseur certains noms clés plus courts dans le doc:

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) 
0

comme une mise à jour pour les personnes à trouver ce fil et intéressé par MongoDB 3.X. Nous utilisons le pilote Async qui peut être trouvé ici https://github.com/evojam/mongodb-driver-scala. Son API est construite de manière Scala avec le nouveau module Play 2.4 prêt si vous l'utilisez, mais vous pouvez toujours prendre seulement le pilote.

Questions connexes