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 № 1Finał 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.