Печать результатов запроса из 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 является асинхронным, чтобы сделать его синхронным, вы можете применить некоторые операторы монад.
- andThen: позволяет связывать наблюдаемые. собирать: собирает все результаты в последовательность.
- flatMap: создайте новый Observable, применив функцию к каждому результату Observable.
- foldLeft: создает новый Observable, содержащий единственный результат примененной функции аккумулятора. foreach: применяет функцию к каждому полученному результату.
- head: возвращает голову наблюдаемого в будущем.
- 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))