我成功将数据插入到mongodb数据库中,但我不知道如何从查询中提取数据。我使用默认的scala mongodb驱动器:
“org.mongodb.scala”%%“mongo-scala-driver”%“1.1.1”
顺便提一句,documentation似乎包含错误。当从doc:
复制粘贴时,此行会出现编译错误collection.find().first().printHeadResult()
这是我查询集合的方式:
collection.find()
如何将其转换为我可以迭代和处理的对象的scala集合?感谢
答案 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")
})
答案 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]。