/ / ReactiveMongo + Play 2: stream sub dokumentu (tablica) - mongodb, scala, stream, playframework-2.3, reactivemongo

ReactiveMongo + Play 2: stream sub dokumentu (tablica) - mongodb, scala, stream, playframework-2.3, reactivemongo

W poniższym przykładzie używam:

  • MongoDB (> 3.0 z silnikiem WiredTiger)
  • Graj w framework 2.3.8 w Scali
  • The org.reactivemongo: play2-reactivemongo: 0.11.0.play23-M3

Po pierwsze, załóżmy, że mamy następujący dokument w kolekcji MongoDB, na przykład "urlColl":

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

W Play można przesyłać strumieniowo nowe dokumenty po stronie klienta, gdy tylko zostaną wstawione do kolekcji "urlColl", za pomocą następującej metody w 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")
}

i niejawny czytelnik:

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

Następnie za każdym razem, gdy wstawiany jest nowy dokument z tablicą "treści", jest on automatycznie wysyłany do klienta.

Moje pytanie jest dość proste:

Czy możliwe jest przesłanie do klienta nowych danych wstrzykniętych w tablicy podrzędnej "content"?

Rzeczywiście, ponieważ nie ma nowego dokumentu wstawionego (nowa wartość jest wstawiana do tablicy istniejącego dokumentu), nic nie jest wykrywane w kursorze, a a fortiori nic nie jest wysyłane do klienta.

Z góry dziękuję!


@cchantep, aby odpowiedzieć na twój ostatni komentarz:

Tak, mam do czynienia z powolnymi pytaniami. W rzeczywistości mam jeden formularz na stronie internetowej używany do przesyłania danych oraz inną stronę internetową, na której serwer wysyła zdarzenia.

Sprawdzanie poprawności formularza na pierwszej stronie może zająć do 3 sekund. W dziennikach Mongo widzę:

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.

To jest dziennik kolekcji zdarzeń (2783 ms) ze względu na kursywę do wyboru. Może to może spowodować problem?

Edytować: Wyłączyłem ruchomy kursor (coll.find (selector) .options (QueryOpts (). Tailable.awaitData)), a wyniki są znacznie lepsze. Masz jakiś pomysł?

Dziękuję Ci!

Odpowiedzi:

0 dla odpowiedzi № 1

Finał wydanie 0.11.0 jest dostępny jako "org.reactivemongo" %% "play2-reactivemongo" % "0.11.0.play23".

Informacje o tablicy podrzędnej, w której można ustawiać kursoryMongoDB (nie tylko z ReactiveMongo) monitoruje nowy górny dokument. Ponieważ dokument jest aktualizowany w celu dodania elementu do właściwości tablica, został już zwrócony w strumieniu kursora, gdy został utworzony.

Jeśli chcesz zaimplementować źródło zdarzeń, lepiej byłoby mieć kursywę ustawialną nad kolekcją zdarzeń, a nie kolekcję encji (kolekcja migawek).

Możesz znaleźć przykładową aplikację Play, używając EventSource z Zagraj w Mongo Knockout.