使用Akka流查看mongo集合

时间:2019-01-06 19:31:51

标签: mongodb scala akka akka-stream reactivemongo

我在mongo中有一个人集合,我想以流的形式遍历集合中的每个人,并为每个人调用一个执行api调用,更改模型并插入新集合的方法在蒙哥。

它看起来像这样:

  def processPeople()(implicit m: Materializer): Future[Unit] = {

    val peopleSource: Source[Person, Future[State]] = collection.find(json()).cursor[Person]().documentSource()

    peopleSource.runWith(Sink.seq[Person]).map(people => {
      people.foreach(person => {
        changeModelAndInsertToNewCollection(person)
      }) 
    })
  }

但是这不起作用...更改模型的部分似乎正在起作用,但是对mongo的插入不起作用。

该方法似乎还没有立即开始,在开始之前需要进行一分钟的处理。...您看到问题了吗?

1 个答案:

答案 0 :(得分:0)

解决方案1:

def changeModelAndInsertToNewCollection(person:Person) : Future[Boolean] ={
//Todo : call mongo api to update the person
???
}

def processPeople()(implicit m: Materializer): Future[Done] = {
val numberOfConcurrentUpdate = 10

val peopleSource: Source[Person, Future[State]] =
  collection
    .find(json())
    .cursor[Person]()
    .documentSource()

peopleSource
  .mapAsync(numberOfConcurrentUpdate)(changeModelAndInsertToNewCollection)
  withAttributes(ActorAttributes.supervisionStrategy(Supervision.restartingDecider))
  .runWith(Sink.ignore)}

解决方案2: 使用Alpakka作为mongo的akka​​流连接器

val source: Source[Document, NotUsed] =
MongoSource(collection.find(json()).cursor[Person]().documentSource())

source.runWith(MongoSink.updateOne(2, collection))