2014-11-10 10 views
6

Sto provando ad usare il plugin Play-ReactiveMongo per leggere/scrivere semplici record in MongoDB con Play e Angular. Il plugin sembra una buona opzione in quanto consente di utilizzare semplici case classes e JSON regolari invece di convertire esplicitamente tra BSON e JSON. Ma i pochi esempi di utilizzo del plugin non sembrano coprire come mappare l'ID oggetto MongoDB a/da JSON all'interno dello stesso framework. Tutto sembra funzionare con un carico di letture/scritture implicite (= magie per me) in background, ma non sembrano gestire l'ID oggetto.Mappa MongoDB _id utilizzando il plug-in Play-Reactivemongo?

Il mio codice è basato su Modern Web Template di Alex Lashford e molto simile a Stephan Godbillion's example using JSON Read/Writes, ma né Alex né Stephan mostrano nulla a che fare con l'ID oggetto MongoDB.

Ho bisogno di qualche tipo di ID univoco per i miei record di dati, quindi posso recuperarli e aggiornarli ecc. E ha senso usare quello fornito da MongoDB, ma non riesco a trovare un modo per usarlo in modo pulito all'interno del plugin Play ReactiveMongo.

Qualcuno sa di un esempio che mostra come utilizzare il plug-in Play ReactiveMongo con raccolte JSON e un modo per mappare l'ID oggetto su/da JSON senza dover convertire tutte le mie elaborazioni per utilizzare BSON?

+0

Se possibile di usato Scala salat avevano una buona documentazione su Mongo e Scala e facilmente integrabili con il gioco https://github.com/leon/play-salat – Yogesh

+0

Grazie, yogesh. Salat potrebbe essere un'opzione, ma ciò richiederebbe di rielaborare il codice esistente e implementare comunque un carico di codice di mapping. Il plug-in Play ReactiveMongo sembra darmi il 90% di quello che mi serve già, ad eccezione dell'ID oggetto. Se devo implementare una mappatura esplicita per l'ID oggetto, probabilmente sarà più facile che passare a Casbah/Salat. Ho solo bisogno di scoprire * come * per fare questo. –

risposta

1

Ho risolto questo problema con la creazione di un altro case classe:

case class Id($oid: String) 

quindi utilizzarlo come segue:

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

Bisogna avere convertitori JSON importati

implicit val idFormat = Json.format[Id] 
implicit val userFormat = Json.format[User] 
1

Non so perché il team di reactivemongo abbia deciso di avere un ObjectId in BSON, ma non in JSON. In ogni caso, è possibile costruire la rappresentazione JSON del MongoDB ObjectId come segue:

import play.api.libs.json._ 
def objectId(id: String) = Json.obj("$oid" -> id) 
yourCollection.find(Json.obj("_id" -> objectId(id))).cursor()... 
Problemi correlati