我正在一个需要数据库连接的项目上练习,我将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,但我发现的一切都不适合我。
答案 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。 希望这有助于其他人。