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 за сценой.