Как обновить документ в драйвере MongoDB Java 3
Каков идиоматический способ апсертировать документ, используя версию 3 драйвера mongodb java (в частности, v3. 0. 1)?
У нас есть коллекция для сеансов, и когда новый сеанс создается или изменяется, мы хотим вставить его в одну операцию - вместо того, чтобы запрашивать, существует ли еще документ, а затем вставлять или заменять.
Наш старый код upsertion использовал драйвер scala casbah 2.7.3. Это выглядело так:
import com.mongodb.casbah.MongoCollection
import com.mongdb.DBObject
val sessionCollection: MongoCollection = ...
val sessionKey: String = ...
val sessionDocument: DBObject = ... // Either create a new one, or find and modify an existing one
sessionCollection.update(
"_id" -> sessionKey,
sessionDocument
upsert = true
)
В нашем текущем проекте мы просто используем простой драйвер java 3.0.1, и мы используем BsonDocument вместо DBObject, чтобы сделать его более безопасным для печати. Я попытался заменить вышесказанное чем-то вроде:
import com.mongodb.client.MongoCollection
val sessionCollection: MongoCollection = ...
val sessionKey: String = ...
val sessionDocument: BsonDocument = // Either create a new one, or find and modify an existing one
val updateOptions = new UpdateOptions
updateOptions.upsert(true)
sessionCollection.updateOne(
"_id" -> new BsonString(sessionKey),
sessionDocument,
updateOptions
)
Это приводит к ошибке " java.яз..IllegalArgumentException: недопустимое имя поля BSON ...". Ошибка описана в этом вопросе, но ОП в этом вопросе не пытался выполнить upsert в одной операции - они использовали контекст, чтобы решить, следует ли заменить / обновить / вставить и т. д...
Я доволен примерами кода в scala или Ява.
Спасибо!
1 ответ:
В серии драйверов Mongo Java 3.0 мы добавили новый Crud API, который является более явным и, следовательно, удобным для начинающих. Эта инициатива была развернута на ряде драйверов MongoDB, но она содержит некоторые изменения по сравнению со старым API.
Поскольку вы не обновляете существующий документ с помощью оператораupdate , метод
updateOneне подходит.Операция, которую вы описываете, является
replaceOneоперация и может выполняться следующим образом:sessionCollection.replaceOne( "_id" -> new BsonString(sessionKey), sessionDocument, (new UpdateOptions()).upsert(true) )
Comments