Scala mongodb:查询结果为列表

时间:2016-05-30 21:34:34

标签: mongodb scala

我成功将数据插入到mongodb数据库中,但我不知道如何从查询中提取数据。我使用默认的scala mongodb驱动器:

  

“org.mongodb.scala”%%“mongo-scala-driver”%“1.1.1”

顺便提一句,documentation似乎包含错误。当从doc:

复制粘贴时,此行会出现编译错误
collection.find().first().printHeadResult()

这是我查询集合的方式:

collection.find()

如何将其转换为我可以迭代和处理的对象的scala集合?感谢

2 个答案:

答案 0 :(得分:3)

是的,我同意编译错误。我认为" collection.find()。first()。printHeadResult()"不属于scala驱动程序1.1.1版本。使用此代码的当前scala驱动程序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 :(得分:0)

据我所知,这是答案。我花了很多时间使用casbah,最近我改用了新的异步scala驱动程序,因此可能会有更多符合人体工程学的方法来做一些我不知道的事情。

基本上,您需要转换可观察对象的结果,然后最终,您可能需要将其转换为不可观察对象,以便您可以与它进行同步代码交互(也许取决于您的目标)在做)。

在当前的Mongo Scala API(撰写本文时为2.7.0)中,您可能会像这样处理文档列表:

coll.find(Document("head" -> 1)).map(dbo => dbo.getInteger("head"))

获取head等于1的文档列表,然后应用map函数通过提取“ head”元素将其从Document(dbo)转换为Int(注意,如果存在不是head字段或非int字段。有更多健壮的方法可以使用get [T]来获取值。

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

另一部分是如何从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的映射函数而创建的List [Int]。