使用 mongo-scala-driver 在 Scala 中打印来自 Mongodb 的查询结果
Printing query results from Mongodb in Scala using mongo-scala-driver
我正在尝试打印 Scala MongoDB 查询的结果
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
)
得到以下信息:
INFO: No server chosen by
ReadPreferenceServerSelector{readPreference=primary} from cluster
description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE,
serverDescriptions=[ServerDescription{address=localhost:27017,
type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing
out
有什么方法可以在控制台中查看检索到的结果吗?
我今天遇到了同样的问题,但我在网上找到了解决方案。
对我有用的方法是在代码末尾添加一个Thread.sleep,这样程序在异步调用后结束就有机会打印元素了。
发生这种情况是因为 Mongo 的 Observables 的反应性质,这意味着您必须使用 Futures 来完成大部分操作。
只有 Thread.sleep 应该可以。
希望对您有所帮助!
您必须包含 Helpers.scala
文件才能使用 printResults()
功能。它位于他们的 github 存储库 Helpers.scala。
这些辅助函数在打印值之前等待 observable 完成。
MongoDB 驱动程序是异步的,要使其同步,您可以应用一些 monads 运算符
- andThen:允许 Observables 的链接。
collect : 将所有结果收集到一个序列中。
- flatMap : 通过对 Observable 的每个结果应用一个函数来创建一个新的 Observable。
- foldLeft :创建一个新的 Observable,其中包含应用累加器函数的单个结果。
foreach :应用应用于每个发出结果的函数。
- head : Returns 未来 Observable 的头部。
- map :通过对 Observable 的每个发射结果应用一个函数来创建一个新的 Observable。
observables 的完整列表:
例如:
val doc = Await.result(myCollection
.find(and(regex("date", s"^${date}T.*"), equal("field", fieldValue)))
.sort(descending("timestamp"))
.first().head(), Duration(10, SECONDS))
我正在尝试打印 Scala MongoDB 查询的结果
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
)
得到以下信息:
INFO: No server chosen by ReadPreferenceServerSelector{readPreference=primary} from cluster description ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, serverDescriptions=[ServerDescription{address=localhost:27017, type=UNKNOWN, state=CONNECTING}]}. Waiting for 30000 ms before timing out
有什么方法可以在控制台中查看检索到的结果吗?
我今天遇到了同样的问题,但我在网上找到了解决方案。
对我有用的方法是在代码末尾添加一个Thread.sleep,这样程序在异步调用后结束就有机会打印元素了。
发生这种情况是因为 Mongo 的 Observables 的反应性质,这意味着您必须使用 Futures 来完成大部分操作。
只有 Thread.sleep 应该可以。
希望对您有所帮助!
您必须包含 Helpers.scala
文件才能使用 printResults()
功能。它位于他们的 github 存储库 Helpers.scala。
这些辅助函数在打印值之前等待 observable 完成。
MongoDB 驱动程序是异步的,要使其同步,您可以应用一些 monads 运算符
- andThen:允许 Observables 的链接。 collect : 将所有结果收集到一个序列中。
- flatMap : 通过对 Observable 的每个结果应用一个函数来创建一个新的 Observable。
- foldLeft :创建一个新的 Observable,其中包含应用累加器函数的单个结果。 foreach :应用应用于每个发出结果的函数。
- head : Returns 未来 Observable 的头部。
- map :通过对 Observable 的每个发射结果应用一个函数来创建一个新的 Observable。
observables 的完整列表:
例如:
val doc = Await.result(myCollection
.find(and(regex("date", s"^${date}T.*"), equal("field", fieldValue)))
.sort(descending("timestamp"))
.first().head(), Duration(10, SECONDS))