MongoDB 使用 Scala 语言

MongoDB with Scala language

我是 MongoDB 和 Scala 语言的新手

我正在使用 scala 语言在本地连接 mongodb

我正在使用以下依赖项

// https://mvnrepository.com/artifact/org.mongodb.scala/mongo-scala-driver

libraryDependencies += "org.mongodb.scala" %% "mongo-scala-driver" % "4.2.3"

我试过的

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();
}

以上代码返回以下格式的数据

FindObservable(com.mongodb.reactivestreams.client.internal.FindPublisherImpl@6253c26)

我也试过

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")
})

我也尝试了 printResult()printHeadResult() 方法,但是 none 的方法有效

请帮忙 提前致谢

Mongo Scala 驱动程序通过返回 Observables 以非阻塞方式工作,需要 Subsribed 才能使用发布的数据。

当您像下面这样订阅 observable 时,

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")
  })
}

您的代码不会等待 observable 实际发布任何内容,它会在订阅后立即完成。因此你什么也得不到。

您可以在末尾添加类似 Thread.sleep(5000) 的东西来阻止并给 obeservable 一些时间来(希望完成并)发布数据。

或者,您可以添加 val resultSeq = observable.collect 以阻止并收集单个序列中的所有已发布数据。

我找到了这个link

它适用于 printResult() 和 printHeadResult() 方法