Печать результатов запроса из Mongodb в Scala с использованием mongo-scala-driver

Я пытаюсь распечатать результаты запроса MongoDB в Scala

val mongoClient: MongoClient = MongoClient()
val database: MongoDatabase = mongoClient.getDatabase("tableScala")
val collection: MongoCollection[Document] = database.getCollection("tableScala")

collection.find().printResults()

Вышла ошибка: Cannot resolve symbol printResults, Ответы на некоторые другие вопросы предлагается использовать mongo-scala-driver версия 1.2, так как printResults() не реализован для версии 1.1 и ниже

SBT файл:

name := "scalaMongoDriver"

version := "1.0"

scalaVersion := "2.11.8"

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

Пробовал печатать вручную, используя:

collection.find().subscribe(
      (user: Document) => println(user.toJson()),                         // onNext
      (error: Throwable) => println(s"Query failed: ${error.getMessage}"), // onError
      () => println("Done")                                               // onComplete
    ) 

привели к следующей информации:

ИНФОРМАЦИЯ: ReadPreferenceServerSelector{readPreference=primary} из описания кластера не выбрал сервер. ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, serverDescription =[ServerDescription{address=localhost:27017, type=UNKNOWN, state=CONNECTING}]]. Ожидание 30000 мс до истечения времени ожидания

Есть ли способ просмотреть полученные результаты в консоли?

4 ответа

Решение

Вы должны включить Helpers.scala файл для использования printResults() функция. Он находится в их github-хранилище Helpers.scala.

Эти вспомогательные функции ждут окончания наблюдаемой, прежде чем она напечатает значения.

У меня была такая же проблема сегодня, но я нашел решение в Интернете.

Для меня работал способ добавления Thread.sleep в конец кода, чтобы после завершения асинхронного вызова программа могла печатать элементы.

Это происходит из-за реактивного характера Observables Монго, что означает, что вы должны выполнять большинство операций с использованием Futures.

Просто Thread.sleep должен работать.

Надеюсь, поможет!

http://mongodb.github.io/mongo-java-driver/4.9/driver-scala/getting-started/quick-start-primer/

Это определено в помощниках для краткого обзора. Конечно, вы можете создавать/копировать их в своем проекте.

Драйвер MongoDB является асинхронным, чтобы сделать его синхронным, вы можете применить некоторые операторы монад.

  1. andThen: позволяет связывать наблюдаемые. собирать: собирает все результаты в последовательность.
  2. flatMap: создайте новый Observable, применив функцию к каждому результату Observable.
  3. foldLeft: создает новый Observable, содержащий единственный результат примененной функции аккумулятора. foreach: применяет функцию к каждому полученному результату.
  4. head: возвращает голову наблюдаемого в будущем.
  5. map: создает новый Observable, применяя функцию к каждому результату, полученному Observable.

Полный список наблюдаемых:

Например:

val doc = Await.result(myCollection
          .find(and(regex("date", s"^${date}T.*"), equal("field", fieldValue)))
          .sort(descending("timestamp"))
          .first().head(), Duration(10, SECONDS))
Другие вопросы по тегам