【问题标题】:Printing query results from Mongodb in Scala using mongo-scala-driver使用 mongo-scala-driver 在 Scala 中打印来自 Mongodb 的查询结果
【发布时间】:2017-03-20 12:26:55
【问题描述】:

我正在尝试在 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} 描述 ClusterDescription{type=UNKNOWN, connectionMode=SINGLE, serverDescriptions=[ServerDescription{地址=localhost:27017, 类型=未知,状态=连接}]}。计时前等待 30000 ms 出去

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

【问题讨论】:

    标签: mongodb scala mongodb-scala mongodb.driver


    【解决方案1】:

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

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

    【讨论】:

    • 如何包含它?
    • @AzoulayJason 只需将文件复制并粘贴到您的项目中,然后像任何其他类一样使用它。
    【解决方案2】:

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

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

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

    只需 Thread.sleep 即可。

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 2016-04-30
        • 2015-06-22
        • 1970-01-01
        相关资源
        最近更新 更多