使用Scala的MongoDB最适合使用哪个库?

时间:2011-01-19 14:30:16

标签: scala mongodb

我想在Scala中使用MongoDB。 我找到了2个库。

  1. 升力蒙戈
  2. 蒙戈-阶驱动器
  3. 您能告诉我哪个库最好用吗? 如果你知道,请告诉我另一个。

3 个答案:

答案 0 :(得分:24)

你应该仔细看看Casbah,这是官方(并且完全支持)的MongoDB Scala驱动程序:

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

我承认有点偏向于项目的创建者和维护者,但官方支持带来了很多好处,包括背后有一个全职开发人员。对于常见的Scala类型和DBObject的Scala集合样式实现,内置了实体类型转换包装器,这些实现比许多其他驱动程序使用的默认Java对象要好得多。还有一个完整的查询dsl,它映射到Mongo查询语法。

我也喜欢Lift的东西,并且最近开始与Lift团队一起工作以帮助改进它。 Foursquare刚刚发布了一个名为Rogue的lift-mongo-record的dsl查询,它可以驱动他们自己的Scala + MongoDB系统:

http://GitHub.com/foursquare/rogue

我发现大多数人都使用Lift或Casbah,但YMMV。如果您需要更多帮助,请随时给我打电话。

答案 1 :(得分: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和才华横溢的McAdams先生支持的Scala驱动程序,所以它真的是一个明智的选择。干杯!

答案 2 :(得分:3)

我们对Casbah用于深层对象或简单地图的方式以及没有真正的案例类映射支持感到不满意所以我们在遗留的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)
相关问题