ReactiveMongo с подразделением Play-json

Я использую play-json для сериализации моих входящих jsons в классы case, например, из источника sqs или из вызовов api.

это очень простой класс JsonSerialization, который я импортирую там, где мне это нужно:

object JsonSerialization {
  implicit val StatusFormat: Format[Status] = EnumFormats.formats(Status)
  implicit val PersonFormat: OFormat[Person] = Json.format[Person]
}

но теперь мне интересно, из того, что я понимаю в моем Dao, должно быть что-то для сериализации моего класса case в BSON, потому что мой Dao получает класс case, и когда я извлекаю что-то для десериализации в мой класс case. Я импортировал только в Дао:

import reactivemongo.play.json.compat.json2bson.{toDocumentReader, toDocumentWriter}
import serializers.JsonSerialization._

и найти и вставить отлично работает,

  def insert(person: Person): Future[Person] = {
    val writeRes: Future[WriteResult] = collection.insert.one(person)

    writeRes.onComplete {
      case Failure(e) => e.printStackTrace()
      case Success(writeResult) =>
        logger.info(s"successfully inserted person")
    }

    writeRes map { _ => person }
  }


  def find(name: String): Future[Person] = {
    collection.find(BSONDocument(
      "name" -> name
    )).requireOne[Person]
  }

подскажите, пожалуйста, какая часть за что отвечает в Дао? Я немного запутался

извините, если это вопрос новичка, но будет полезно получить краткое объяснение

1 ответ

Я использую Play framework 2.8 с ReactiveMongo 1.0. Что я обычно делаю, так это

1. Сделайте находку в коллекции.

Это вернет некоторые BSONDocuments, и вам необходимо предоставить средства чтения и записи BSON для преобразования BSONDocuments в/из ваших классов дел. Вы можете увидеть некоторые уроки и примеры здесь . Затем вы можете выполнить несколько общих запросов со следующим кодом:

          for {
        c <- database.map(_.collection(collectionName))
        r <- c.find(selector.getOrElse(BSONDocument()), projection)
            .sort(sorter.getOrElse(BSONDocument()))
            .cursor[T]().collect[List](Int.MaxValue, Cursor.FailOnError[List[T]]())
    } yield r

2. Вернуть результат запроса в формате JSON

Когда вы получили результат запроса, вы можете вернуть его в формате JSON с помощью Json.toJson(), который будет неявно вызывать средства чтения/записи JSON классов case.

      Person.find().map {
    item => {
        Ok(Json.toJson(item))
    }
}

Я не использовал bson2json, и я думаю, что это помогло преобразовать класс case в JSON за сценой.

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