2011-01-19 75 views
15

我想在Scala中使用MongoDB。 我找到了2個庫。哪個庫最適合用於具有Scala的MongoDB?

  1. 升蒙戈
  2. 蒙戈 - 斯卡拉驅動

你能告訴我這圖書館是最好用? 如果你知道的話,請告訴我其他人。

+0

約ReactiveMongo什麼? (http://reactivemongo.org/) – 2013-09-16 02:27:06

回答

24

你應該採取在卡斯巴仔細看,這是官方(並完全支持)的MongoDB斯卡拉司機:

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

林誠然偏置作爲該項目的創建者和維護者,但官方支持帶來很多好處,包括背後有全職開發人員的事實。對於通用Scala類型和Scala集合類型的DBObject實現,內置了固體類型轉換包裝器,這些實現比許多其他驅動程序使用的默認Java對象要好得多。還有一個完整的查詢dsl映射到Mongo查詢語法。

我喜歡Lift的東西,最近也開始與Lift團隊合作幫助改善它。四方剛剛發佈了名爲盜賊用於提升蒙戈記錄查詢DSL驅動自己的Scala + MongoDB的系統:

http://GitHub.com/foursquare/rogue

我發現大多數人使用的是電梯或卡斯巴,但情況因人而異。如果您需要更多幫助,請隨時與我聯繫。

+0

盜賊似乎被遺棄 - 最近6個月前提交。 – 2014-07-25 12:31:54

5

作爲Casbah的一個無偏見的用戶,現在我說,肯定會使用Casbah。

檢查:

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

這當然只是一種味道。特別是如果你來自Java驅動程序,使用起來非常清爽。既然現在是10Gen和天才麥克亞當斯先生支持的Scala驅動程序,那麼這真是一件容易的事情。乾杯!

3

我們與卡斯巴適用於深物體或簡單的地圖,並沒有真正的案例類映射支持,所以我們在該舊式Java驅動程序之上,我想用無恥地插在此處推出我們自己的MongoDB Synchronous Scala driver的方式有點不滿意有關如何存儲和檢索地圖和簡單案例類的示例。該驅動程序沒有太多的魔力,並且易於安裝,並且具有受Play2 JSON impl啓發的簡單BSON實現。

下面是如何用一些簡單的數值使用它:

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" 

並配有案例類:

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)