Scala MongoDB:将查询结果作为列表返回

6
我成功地向MongoDB数据库插入了数据,但我不知道如何从查询中提取数据。我使用默认的Scala MongoDB驱动程序:

"org.mongodb.scala" %% "mongo-scala-driver" % "1.1.1"

顺便说一下,文档似乎存在错误。这行代码是从文档中复制粘贴的,但会引发编译错误:
collection.find().first().printHeadResult()

这是我查询集合的方式:

collection.find()

如何将它转换为Scala对象集合,以便我可以迭代和处理?谢谢。

使用 "org.mongodb.scala" %% "mongo-scala-driver" % "2.1.0" 时出现相同的错误。 - Evhz
2个回答

3

是的,我同意编译错误。我认为"collection.find().first().printHeadResult()"不是scala driver 1.1.1版本的一部分。目前使用此代码的scala driver github版本为"1.2.0-SNAPSHOT"。

您可以使用以下代码获取结果。但是,使用以下代码可能会遇到一些异步行为。请参考驱动程序文档。

val observable: FindObservable[Document] = collection.find();
observable.subscribe ( new Observer[Document] {
  override def onNext(result: Document): Unit = println(result.toJson())
  override def onError(e: Throwable): Unit = println("Failed" + e.getMessage)
  override def onComplete(): Unit = println("Completed")
})

Mongo driver Observables link


1
谢谢,但是你现在使用的是subscribe函数内部的数据。如果我需要在subscribe函数外部使用这些数据怎么办?是否有类似于“subscribe”函数返回所有结果列表的函数? - Moebius
1
我在Scala驱动程序库中没有看到类似的东西。但是,您可以尝试使用“casbah”。当我尝试时,它与我的Scala版本不兼容。因此,我放弃了这个想法。您可以探索这个选项。 http://api.mongodb.com/scala/casbah/2.0/tutorial.html - notionquest

0
这是我目前所知道的最佳答案。我花了很多时间使用casbah,最近切换到使用新的异步scala驱动程序,因此可能有更符合人体工程学的方法来完成一些我还不知道的事情。
基本上,您需要转换可观察结果,然后最终可能希望将其转换为不是可观察的东西,以便可以让同步代码与之交互(根据您正在做什么)。
在当前的Mongo Scala API(截至撰写本文的时候为2.7.0),您可以像这样处理文档列表:
coll.find(Document("head" -> 1)).map(dbo => dbo.getInteger("head"))

该函数接受一个文档列表,其中head等于1,然后应用map函数将其从Document(dbo)转换为Int,方法是提取“head”元素(请注意,如果没有head字段或该字段不是int,则会以丑陋的方式失败。有更健壮的方法使用get [T]获取值)。

您可以在此处找到Observable支持的操作的完整列表: https://mongodb.github.io/mongo-scala-driver/2.7/reference/observables/ 在单子运算符列表下。

另一部分是如何从Observable中获取好的内容,因为您想要对它们进行同步处理。到目前为止,我发现最好的答案是将Observable转储到Future中,然后调用Await.result。

val e = coll.find(Document("head" -> 1)).map(dbo => dbo.getInteger("head"))
val r = Await.result(e.toFuture(), Duration.Inf)
println(r)

这将打印出由在Observable中为每个Document评估map函数创建的List[Int]。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接