Scala使用mongo-scala-driver连接MongoDB查询无结果如何解决
你遇到的问题根源是MongoDB Scala驱动是基于*响应式流(Reactive Streams)*规范实现的,所有操作都是异步非阻塞的,你的主线程在订阅查询之后没有等待异步任务执行完成就直接退出了,所以看不到输出结果。
你可以按下面的步骤排查修改:
- 先确认基础环境正常:本地MongoDB服务已启动,27017端口可正常访问,
DemoDB库下存在demodata集合且集合内有数据。 - 在代码中添加等待异步任务执行完成的逻辑,最简单的方式是引入
scala.concurrent.Await阻塞主线程直到查询结束。
修改后的完整可运行代码如下:
import org.mongodb.scala._ import scala.concurrent.Await import scala.concurrent.duration._ object Demo extends App { val mongoClient: MongoClient = MongoClient("mongodb://127.0.0.1:27017/") val database: MongoDatabase = mongoClient.getDatabase("DemoDB") println(database) val collection: MongoCollection[Document] = database.getCollection("demodata") val observable = collection.find() // 订阅逻辑保留即可 observable.subscribe ( new Observer[Document] { override def onNext(result: Document): Unit = println(result.toJson()) override def onError(e: Throwable): Unit = println("Failed" + e.getMessage) override def onComplete(): Unit = println("Completed") }) // 核心:阻塞主线程最多10秒等待查询完成,可根据数据量调整超时时间 Await.result(observable.toFuture(), 10.seconds) // 操作完成后关闭客户端连接 mongoClient.close() }
如果你想用printResult()、printHeadResult()这类工具方法,同样需要加上上面的等待逻辑:
observable.printResults() Await.result(observable.toFuture(), 10.seconds)
本地调试也可以直接把查询结果同步转为集合使用:
val resultList: Seq[Document] = Await.result(observable.collect().toFuture(), 10.seconds) resultList.foreach(doc => println(doc.toJson()))
内容的提问来源于stack exchange,提问作者Piyush Jiwane
相关产品推荐
相关产品推荐

