Какую библиотеку лучше всего использовать для MongoDB с помощью Scala?

Я хочу использовать MongoDB с Scala. Я нашел для него 2 библиотеки.

  • подъемная Монго
  • mongo- scala -driver

Не могли бы вы рассказать мне, какая библиотека лучше всего использовать? И, пожалуйста, скажите мне другой, если вы знаете.

Ответы

Ответ 1

Вы должны внимательно посмотреть на Casbah, который является официальным (и полностью поддерживаемым) драйвером MongoDB Scala:

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

Im, по общему признанию, предвзято, как создатель и сторонник проекта, но официальная поддержка приносит большую пользу, в том числе тот факт, что за ним стоит полный рабочий день. Существуют встроенные конвертеры сплошного типа, встроенные для обычных типов Scala и Scala реализаций стиля коллекций DBObject, которые намного лучше, чем объекты Java по умолчанию, используемые многими другими драйверами. Существует также полный запрос dsl, который отображает синтаксис запросов Mongo.

Мне нравятся вещи Lift, а также недавно начали работать с командой Lift, чтобы помочь улучшить ее. Foursquare только что выпустил запрос dsl для лифтинго-рекорд-записи Rogue, который управляет собственной системой Scala + MongoDB:

http://GitHub.com/foursquare/rogue

Я нашел, что большинство людей используют лифтинг или Касба, но YMMV. Не стесняйтесь пинговать меня, если вам нужна дополнительная помощь.

Ответ 2

Как беспристрастный пользователь 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. И так как теперь драйвер Scala, поддерживаемый 10Gen и талантливым мистером МакАдамсом, это действительно нелегко. Ура!

Ответ 3

Мы были неудовлетворены тем, как Casbah работает для глубоких объектов или простых карт и не поддерживает реальную привязку к классу case, поэтому мы перевернули собственный MongoDB Synchronous Scala драйвер поверх устаревшего java-драйвера, который я хотел бы бесстыдно подключить сюда к примеру о том, как хранить и извлекать карту и простой класс case. Драйвер не имеет большого количества магии и легко настраивается и имеет простую реализацию BSON, которая была вдохновлена ​​Play2 JSON impl.

Вот как использовать его с некоторыми простыми значениями:

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:

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)