使用mongo-scala-driver从Scala中的Mongodb打印查询结果

时间:2016-11-07 08:09:13

标签: mongodb scala mongodb-scala mongodb.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的其他一些问题的答案,因为版本1.1及以下

未实现printResults()

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毫秒   出

有没有办法在控制台中查看检索到的结果?

3 个答案:

答案 0 :(得分:6)

您必须包含Helpers.scala文件才能使用printResults()功能。它位于他们的github存储库Helpers.scala

这些辅助函数在打印值之前等待observable完成。

答案 1 :(得分:2)

我今天遇到了同样的问题,但我在网上找到了解决方案。

对我有用的方法是在代码的末尾添加一个Thread.sleep,因此异步调用之后程序结束有机会打印元素。

这是因为Mongo's Observables的反应性质,这意味着您必须完成大部分使用Futures的操作。

只需要Thread.sleep就可以了。

希望它有所帮助!

答案 2 :(得分:1)

MongoDB驱动程序是异步的,要使其同步,您可以应用一些monads运算符

  1. andThen :允许链接Observable。 collect:将所有结果收集到一个序列中。
  2. flatMap :通过对Observable的每个结果应用函数来创建新的Observable。
  3. foldLeft :创建一个新的Observable,其中包含所应用累加器函数的单个结果。 foreach:将一个函数应用于每个发出的结果。
  4. head :返回将来可观察对象的头部。
  5. 地图:通过对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))