我在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的插入不起作用。
该方法似乎还没有立即开始,在开始之前需要进行一分钟的处理。...您看到问题了吗?
答案 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))