Mongo Scala驱动程序 - 无法插入数据库

时间:2017-12-08 10:37:42

标签: mongodb scala mongo-scala-driver

我正在一个需要数据库连接的项目上练习,我将Play框架与Scala和MongoDB结合使用。

我也使用Mongo-scala-driver并遵循documentation。 我写了完全相同的代码:

    println("start")

    val mongoClient: MongoClient = MongoClient("mongodb://localhost:27017/Sandbox")

    val database: MongoDatabase = mongoClient.getDatabase("test")

    val collection: MongoCollection[Document] = database.getCollection("test")

    val doc: Document = Document("_id" -> 0, "name" -> "MongoDB", "type" -> "database", "count" -> 1, "info" -> Document("x" -> 203, "y" -> 102))

    collection.insertOne(doc).subscribe(new Observer[Completed] {

      override def onSubscribe(subscription: Subscription): Unit = println("Subscribed")

      override def onNext(result: Completed): Unit = println("Inserted")

      override def onError(e: Throwable): Unit = println("Failed")

      override def onComplete(): Unit = println("Completed")
    })

    mongoClient.close()

    println("end")

没有任何内容插入到数据库中,我从日志中获得的唯一结果是:

start
Subscribed
end

我一直在寻找类似主题的stackoverflow,但我发现的一切都不适合我。

3 个答案:

答案 0 :(得分:1)

您尝试在异步模式下插入文档。 因此,您必须在onNext onError和onComplete上定义三个回调函数 但是你没有给执行插入时间。

尝试在关闭连接之前附加任何超时。例如,简单添加

Thread.sleep(1000)

mongoClient.close()

你不需要重新定义onSubscribe()

如果您不希望在从请求中移入文档列表时手动控制需求,则不需要覆盖onSubscribe()。 onSubscrime()的默认定义非常适用于简单的请求。在你的情况下,你不需要覆盖他。

下一个代码正常工作

println("start")
val mongoClient: MongoClient = MongoClient("mongodb://DB01-MongoDB:27017/Sandbox")
val database: MongoDatabase = mongoClient.getDatabase("test")
val collection: MongoCollection[Document] = database.getCollection("test")
val doc: Document = Document("_id" -> 0,
                             "name"  -> "MongoDB",
                             "type"  -> "database",
                             "count" -> 1,
                             "info"  -> Document("x" -> 203, "y" -> 102))
collection
  .insertOne(doc)
  .subscribe(new Observer[Completed] {
    override def onNext(result: Completed): Unit = println("Inserted")
    override def onError(e: Throwable): Unit     = println("Failed")
    override def onComplete(): Unit              = println("Completed")
  })

Thread.sleep(1000)
mongoClient.close()
println("end")

}

答案 1 :(得分:1)

以上解决方案可能有效,但每次插入(或任何通话)时您可能必须交易1秒。另一个解决方案是利用回调:

val insertObservable = collection.insertOne(doc)

insertObservable.subscribe(new Observer[Completed] {
    override def onComplete(): Unit = mongoClient.close()
  })

交易完成后,连接会自动关闭,不会浪费1秒。

答案 2 :(得分:0)

问题是Observer,我是从org.mongodb.async.client导入的,但好的是org.mongodb.scala。 希望这有助于其他人。