/ / ReactiveMongo + Play 2: поточен поддокумент (масив) - mongodb, scala, stream, playframework-2.3

ReactiveMongo + Play 2: поток под-документ (масив) - mongodb, скала, поток, playframework-2.3, reactivemongo

В следващия пример използвам:

  • MongoDB (> 3.0 с WiredTiger)
  • Играйте рамка 2.3.8 в Scala
  • Org.reactivemongo: play2-reactivemongo: 0.11.0.play23-M3

На първо място, предположим, че имаме следния документ в колекция MongoDB, наречен например "urlColl":

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

В Play е възможно да се прехвърлят нови документи на клиентската страна веднага след като бъдат поставени в колекцията "urlColl", със следния метод в 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")
}

и скрития читател:

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

След това всеки път, когато се вмъкне нов документ с масив "съдържание", той автоматично се изпраща на клиента.

Въпросът ми е съвсем прост:

Възможно ли е да насочите към клиента новите данни, инжектирани в под-масив "съдържание"?

Всъщност, тъй като не е вмъкнат нов документ (в масива на съществуващия документ е вмъкната нова стойност), нищо не се открива в курсора и a fortiori нищо не се изпраща на клиента.

Благодаря ви предварително!


@cchantep, за да отговори на последния ви коментар:

Да, имам някои бавни заявки. Всъщност имам един формуляр в уеб страница, използвана за препращане на данни, и друга уеб страница, на която сървърът изпраща събитията.

Валидирането на формата на първата страница може да отнеме до 3 секунди. В дневниците на Монго мога да видя:

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.

Това е дневник на събирането на събития (2783ms), дължащо се на подвижния курсор. Може би това може да причини проблема?

Редактиране: Деактивирах курсора (coll.find (selector) .options (QueryOpts (). Tailable.awaitData)) и изпълненията са много по-добри. Имате ли някаква идея?

Благодаря ти!

Отговори:

0 за отговор № 1

Финалът освобождаване от 0.11.0 е достъпна като "org.reactivemongo" %% "play2-reactivemongo" % "0.11.0.play23".

За под-масива, подвижните курсори вMongoDB (не само с ReactiveMongo) наблюдават нов топ-документ. Тъй като вашият документ е актуализиран, за да добавите елемент в свойството на масива, той вече е бил върнат в курсора, когато е бил създаден.

Ако искате да приложите източник на събития, би било по-добре да имате курсора на опашката над колекция от събития, а не върху колекция от обекти (snapshot collection).

Можете да намерите примерно приложение за възпроизвеждане, което използвате EventSource с Възпроизвеждане на Mongo Knockout.