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

Mongo Scala Driver - Can't insert in the database

我正在练习一个需要数据库连接的项目,我正在使用 Play Framework 结合 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

我一直在 Whosebug 上寻找类似主题,但我发现的所有内容都不适合我。

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

}

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

上述解决方案可能有效,但您可能需要在每次插入(或任何调用)时交易 1 秒。另一种解决方案是利用回调:

val insertObservable = collection.insertOne(doc)

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

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