/ / ReactiveMongo + Play 2: diffusion d'un sous-document (tableau) - mongodb, scala, stream, playframework-2.3, reactivemongo

ReactiveMongo + Play 2: diffuser un sous-document (tableau) - mongodb, scala, stream, playframework-2.3, reactivemongo

Dans l'exemple suivant, j'utilise:

  • MongoDB (> 3.0 avec moteur WiredTiger)
  • Cadre de jeu 2.3.8 en Scala
  • Le org.reactivemongo: play2-reactivemongo: 0.11.0.play23-M3

Tout d'abord, supposons que nous ayons le document suivant dans une collection MongoDB appelée par exemple "urlColl":

{
"_id" : ObjectId("5593bebe89645672000deec4"),
"url" : "urlPath",
"content" : [
"a",
"ab",
"abc",
"abcd"
]}

Dans Play, il est possible de diffuser de nouveaux documents côté client dès qu'ils sont insérés dans la collection "urlColl", avec la méthode suivante dans Play:

def feed = Action {
val cursor = collection
.find(BSONDocument(), BSONDocument("content" -> 1))
.options(QueryOpts().tailable.awaitData)
.cursor[List[Try[BSONValue]]](ReadPreference.nearest)

val dataProducer = cursor.enumerate(Int.MaxValue).map(_.toString)
Ok.chunked(dataProducer &> EventSource()).as("text/event-stream")
}

et le lecteur implicite:

implicit object ContentToList extends BSONDocumentReader[List[Try[BSONValue]]] {
def read(doc: BSONDocument): List[Try[BSONValue]] = {
doc.getAs[BSONArray]("content").get.stream.toList
}
}

Ensuite, chaque fois qu'un nouveau document avec un tableau "contenu" est inséré, il est automatiquement envoyé au client.

Ma question est assez simple:

Est-il possible de transmettre au client les nouvelles données injectées dans le sous-tableau "contenu"?

En effet, puisqu’il n’y a pas de nouveau document inséré (une nouvelle valeur est insérée dans le tableau du document existant), rien n’est détecté dans le curseur et a fortiori rien n’est envoyé au client.

Merci d'avance!


@cchantep, pour répondre à votre dernier commentaire:

Oui, je suis confronté à des requêtes lentes. En fait, j'ai un formulaire dans une page Web utilisé pour transmettre des données et une autre page Web où le serveur envoie les événements.

La validation du formulaire de la première page peut prendre jusqu'à 3 secondes. Dans les journaux Mongo, je peux voir:

I QUERY    [conn329] getmore test.events cursorid:22982535122 ntoreturn:0
keyUpdates:0 writeConflicts:0 numYields:0 nreturned:1 reslen:86
locks:{ Global: { acquireCount: { r: 1000 } }, Database: { acquireCount:
{ r: 1000 } }, Collection: { acquireCount: { r: 1000 } } } 2783ms.

Ceci est un journal de la collection d’événements (2783ms) en raison du curseur disponible. Peut-être que cela peut causer le problème?

Éditer: J'ai désactivé le curseur disponible (coll.find (sélecteur) .options (QueryOpts (). Tailable.awaitData)) et les performances sont bien meilleures. Avez-vous une idée?

Je vous remercie!

Réponses:

0 pour la réponse № 1

Le final version 0.11.0 est disponible en tant que "org.reactivemongo" %% "play2-reactivemongo" % "0.11.0.play23".

À propos du sous-tableau, les curseurs disponibles dansMongoDB (pas seulement avec ReactiveMongo) surveille le nouveau top-document. Étant donné que votre document est mis à jour pour ajouter un élément dans la propriété du tableau, il a déjà été renvoyé dans le flux de curseur lors de sa création.

Si vous souhaitez implémenter une source d'événements, il serait préférable d'avoir un curseur disponible sur une collection d'événements plutôt que sur une collection d'entités (collection d'instantanés).

Vous pouvez trouver un exemple d'application Play en utilisant EventSource avec Jouer à Mongo Knockout.