2016-05-23 16 views
0

hinzugefügt Lesen http://reactivemongo.org/releases/0.11/documentation/tutorial/consume-streams.html haben diesen CodeRückkehr Dokument, wie sie mit Scala reactivemongo

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global 

import play.api.libs.iteratee._ 
import reactivemongo.bson.BSONDocument 
import reactivemongo.api.collections.bson.BSONCollection 

def processPerson1(collection: BSONCollection, query: BSONDocument): Future[Unit] = { 
    val enumeratorOfPeople: Enumerator[BSONDocument] = 
    collection.find(query).cursor[BSONDocument].enumerate() 

    val processDocuments: Iteratee[BSONDocument, Unit] = 
    Iteratee.foreach { person => 
     val lastName = person.getAs[String]("lastName") 
     val prettyBson = BSONDocument.pretty(person) 
     println(s"found $lastName: $prettyBson") 
    } 

    enumeratorOfPeople.run(processDocuments) 
} 

Run ist wie folgt definiert: ‚treibt die iteratee die Eingabe des Enumerator zu konsumieren, ein Input.EOF am Ende des Eingangs Hinzufügen . Gibt entweder ein Ergebnis oder eine Ausnahme zurück. von https://www.playframework.com/documentation/2.5.1/api/scala/index.html#play.api.libs.iteratee.Enumerator Bedeutet dies, dass, wenn ein neues Dokument zur Datenbank hinzugefügt wird, die 'processPerson1' erneut aufgerufen werden muss, damit diese Zeile ausgeführt werden kann, damit sie zurückgegeben wird.

Ich möchte nur die Dokumente zurückgeben, wie sie der Datenbank hinzugefügt werden, ohne denselben Code erneut aufzurufen. Mögliche 'nicht sehr gute' Lösung ist es, nur enumeratorOfPeople.run(processDocuments) in einem geplanten Thread wickeln, aber das Problem des Empfangs aller Dokumente bleibt, möchte ich nur Dokumente, die noch nicht zurückgegeben wurden

+0

Nicht spezifisch für ReactiveMongo. Sie sollten sich kapotierte Sammlungen ansehen. – cchantep

+0

@cchanstep meinst du 'capped collections'? –

Antwort

0

Ich habe eine Capped Mongo-Sammlung mit Abfrage erstellt :

db.createCollection ("cappedCollection", { "capped": "true" "autoIndexId": "true", "Größe": 4096, "max": 10})

Dann Optionen bei der Abfrage mit find:

verwenden

.options(QueryOpts().tailable.awaitData) - genauer: Play + ReactiveMongo: capped collection and tailable cursor

Wenn ein neues Dokument Sammlung das neueste hinzugefügt Dokument die run Methode hinzugefügt wird, wird zurückkehren.