0

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

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

    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,但我发现的所有内容都对我不起作用。

4

3 回答 3

2

您尝试以异步模式插入文档。因此你必须定义三个回调函数 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")

}

于 2017-12-08T13:12:58.400 回答
1

问题是观察者,我从 org.mongodb.async.client 导入了它,但好的是 org.mongodb.scala。希望这对其他人有帮助。

于 2017-12-12T16:40:29.020 回答
1

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

val insertObservable = collection.insertOne(doc)

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

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

于 2018-10-28T10:33:05.780 回答