В следващия пример използвам:
- 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.