Поскольку «MongoDb Scala Driver» является единственным официальным драйвером Scala сейчас, я планирую перейти с Casbah. Однако MongoDb Scala Driver, похоже, поддерживает только асинхронный API (по крайней мере, в его документации). Есть ли способ сделать синхронные запросы?Как сделать синхронные запросы с помощью драйвера MongoDb Scala
1
A
ответ
4
У меня были те же проблемы несколько дней назад, когда я переезжал из Касбы. По-видимому, официальный драйвер Mongodb использует шаблон наблюдателя. Я хотел получить порядковый номер из коллекции, и мне пришлось ждать, пока значение будет восстановлено для продолжения операции. Я не уверен, что это правильный путь, но, по крайней мере, это один из способов сделать это:
def getSequenceId(seqName: String): Int = {
val query = new BsonDocument("seq_id", new BsonString(seqName))
val resultado = NewMongo.SequenceCollection.findOneAndUpdate(query,inc("nextId",1))
resultado.subscribe(new Observer[Document] {
override def onNext(result: Document): Unit ={}
override def onError(e: Throwable): Unit ={}
override def onComplete(): Unit = {}
})
val awaitedR = Await.result(resultado.toFuture, Duration.Inf).asInstanceOf[List[Document]](0)
val ret = awaitedR.get("nextId").getOrElse(0).asInstanceOf[BsonDouble].intValue();
return ret;
}
Видимо, вы можете преобразовать результат наблюдателя в будущее и ждать его возвращения, используя функцию ЖДУТ, как я сделал , Затем вы можете манипулировать результатом по своему усмотрению.
конфигурации базы данных заключается в следующем:
private val mongoClient: MongoClient = MongoClient("mongodb://localhost:27017/?maxPoolSize=30")
private val database: MongoDatabase = mongoClient.getDatabase("mydb");
val Sequence: MongoCollection[Document] = database.getCollection(SEQUENCE);
Надеюсь, мой ответ был полезным
Спасибо @ israel.zinc. Цените свой подробный ответ. Я понимаю, что мы можем сделать это, используя будущее, но надеялись на более чистую синхронную апи. Угадай, что у нас нет этого больше :( –