Лучший драйвер mongodb для Play Framework 2.1

Какой лучший драйвер MongoDB для Play Framework 2.1?

Сейчас я пробую ReactiveMongo, но нигде не могу найти хорошую документацию, и у меня есть сомнения по поводу ее дальнейшего развития.

Какой драйвер самый популярный и поддерживаемый?

Спасибо,

Джорджия

3 ответа

Решение

Я не делал никаких сравнений, так что я бы не стал утверждать, что он лучший, но когда я начал свой текущий проект, был только salat с его Play! плагин. Он довольно хорошо задокументирован (см. Его github wiki) и находится в стадии активной разработки. Я бы сказал, что это качество производства. Если вам не хватает документации, в репозитории есть примеры использования в тестовых пакетах.

Мы были недовольны тем, как Casbah работает с глубокими объектами или простыми картами, и отсутствием реальной поддержки отображения классов дел, поэтому мы свернули наш собственный драйвер MongoDB Synchronous Scala поверх устаревшего java-драйвера, который я хотел бы бесстыдно подключить здесь с примером о том, как хранить и извлекать карту и простой класс дела. Драйвер не обладает большой магией, прост в настройке и имеет простую реализацию 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)

Вы можете попытаться использовать Moscale. Я реализую эту библиотеку с моими коллегами в рамках другого проприетарного проекта. Библиотека сейчас используется в производстве. Отсутствует документация, но она чрезвычайно полезна и очень проста. Вы можете посмотреть на тесты, а не на документацию, и есть небольшой пример простого использования.

Другие вопросы по тегам