簡體   English   中英

使用 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 version 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, serverDescriptions=[ServerDescription{address=localhost:27017, type=UNKNOWN, state=CONNECTING}]} 選擇服務器。 超時前等待 30000 毫秒

有沒有辦法在控制台中查看檢索到的結果?

您必須包含Helpers.scala文件才能使用printResults()函數。 它位於他們的 github 存儲庫Helpers.scala 中

這些輔助函數在打印值之前等待 observable 完成。

我今天遇到了同樣的問題,但我在網上找到了解決方案。

對我有用的方法是在代碼末尾添加一個 Thread.sleep,所以程序在異步調用后結束有機會打印元素。

發生這種情況是因為 Mongo 的 Observables 具有反應性,這意味着您必須使用 Futures 來完成大部分操作。

只有 Thread.sleep 應該可以工作。

希望有幫助!

MongoDB 驅動程序是異步的,為了使其同步,您可以應用一些 monads 操作符

  1. andThen :允許鏈接 Observables。 collect :將所有結果收集到一個序列中。
  2. flatMap :通過對 Observable 的每個結果應用一個函數來創建一個新的 Observable。
  3. foldLeft :創建一個新的 Observable,其中包含應用累加器函數的單個結果。 foreach :應用一個函數應用於每個發出的結果。
  4. head : 在未來返回 Observable 的頭部。
  5. 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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM