Сопоставить MongoDB _id с помощью плагина Play-Reactivemongo?

Я пытаюсь использовать плагин Play-ReactiveMongo для чтения/записи простых записей в MongoDB с помощью Play и Angular. Плагин кажется хорошим вариантом, поскольку он позволяет вам использовать простые классы case и обычный JSON вместо явного преобразования между BSON и JSON. Но несколько примеров использования плагина, похоже, не охватывают, как сопоставить идентификатор объекта MongoDB с/из JSON в той же структуре. Кажется, все это работает с загрузкой неявных (= волшебных для меня) операций чтения/записи в фоновом режиме, но они, похоже, не обрабатывают идентификатор объекта.

Мой код основан на современном веб-шаблоне Алекса Лашфорда и очень похож на Пример Стефана Годбиллиона с использованием JSON Read/Writes, но ни Алекс, ни Стефан не показывают ничего общего с идентификатором объекта MongoDB.

Мне нужен какой-то уникальный идентификатор для моих записей данных, чтобы я мог их извлекать и обновлять и т. д., и имеет смысл использовать тот, который предоставляет MongoDB, но я не могу найти способ использовать это чисто в Play ReactiveMongo плагин.

Кто-нибудь знает пример, который показывает, как использовать плагин Play ReactiveMongo с коллекциями JSON и каким-то образом сопоставить идентификатор объекта с/из JSON без необходимости конвертировать всю мою обработку для использования BSON?


person Chris Webster    schedule 10.11.2014    source источник
comment
Если возможно, вы использовали scala salat, у них была хорошая документация о mongo и scala, и они легко интегрировались с игрой github.com/ леон/плей-салат   -  person Yogesh    schedule 10.11.2014
comment
Спасибо, йогеш. Салат может быть вариантом, но это потребует от меня переделки существующего кода и реализации большого количества кода сопоставления. Плагин Play ReactiveMongo, кажется, дает мне 90% того, что мне уже нужно, за исключением идентификатора объекта. Если мне нужно реализовать какое-то явное сопоставление для идентификатора объекта, это, вероятно, будет проще, чем переключиться на Casbah/Salat. Мне просто нужно узнать, как это сделать.   -  person Chris Webster    schedule 10.11.2014


Ответы (2)


Я решил эту проблему, создав еще один класс case:

case class Id($oid: String)

затем используйте его следующим образом:

case class User(_id: Id, ...)

У вас должны быть импортированы конвертеры Json

implicit val idFormat = Json.format[Id]
implicit val userFormat = Json.format[User]
person kurochenko    schedule 30.06.2015

Я не знаю, почему команда reactivemongo решила иметь ObjectId в BSON, а не в JSON. В любом случае, вы можете построить JSON-представление MongoDB ObjectId следующим образом:

import play.api.libs.json._
def objectId(id: String) = Json.obj("$oid" -> id)
yourCollection.find(Json.obj("_id" -> objectId(id))).cursor()...
person David Portabella    schedule 16.08.2016