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