我正在尝试在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
的其他一些问题的答案,因为版本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} description ClusterDescription {type = UNKNOWN,connectionMode = SINGLE, serverDescriptions = [{ServerDescription地址=本地主机:27017, type = UNKNOWN,state = CONNECTING}]}。在计时之前等待30000毫秒 出
有没有办法在控制台中查看检索到的结果?
答案 0 :(得分:6)
您必须包含Helpers.scala
文件才能使用printResults()
功能。它位于他们的github存储库Helpers.scala。
这些辅助函数在打印值之前等待observable完成。
答案 1 :(得分:2)
我今天遇到了同样的问题,但我在网上找到了解决方案。
对我有用的方法是在代码的末尾添加一个Thread.sleep,因此异步调用之后程序结束有机会打印元素。
这是因为Mongo's Observables的反应性质,这意味着您必须完成大部分使用Futures的操作。
只需要Thread.sleep就可以了。
希望它有所帮助!
答案 2 :(得分:1)
MongoDB驱动程序是异步的,要使其同步,您可以应用一些monads运算符
observables的完整列表:
例如:
val doc = Await.result(myCollection
.find(and(regex("date", s"^${date}T.*"), equal("field", fieldValue)))
.sort(descending("timestamp"))
.first().head(), Duration(10, SECONDS))