mongodb Javaドライバー(具体的にはv3.0.1)のバージョン3を使用してドキュメントをアップサートする慣用的な方法は何ですか?
セッションのコレクションがあり、新しいセッションが作成または変更されたときに、ドキュメントがまだ存在するかどうかを照会してから挿入または置換するのではなく、1回の操作でそれをアップサートしたいと考えています。
私たちの古いアップサーションコードはscalaドライバーcasbah2.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.lang.IllegalArgumentException:Invalid BSON fieldname ...」というエラーがスローされます。エラーは この質問 でカバーされていますが、その質問の操作は1つの操作でアップサートを試みていませんでした-コンテキストを使用して、置換/更新/挿入などを決定していました...
scalaまたはJavaのコードサンプルに満足しています。
ありがとう!
Mongo Java Driver 3.0シリーズでは、より明確で初心者に優しい新しいCrud APIを追加しました。このイニシアチブは多くのMongoDBドライバーに展開されていますが、いくつかの変更点が比較されています古いAPIに。
更新演算子 を使用して既存のドキュメントを更新していないため、updateOne
メソッドは適切ではありません。
説明する操作は replaceOne
操作であり、次のように実行できます。
sessionCollection.replaceOne(
"_id" -> new BsonString(sessionKey),
sessionDocument,
(new UpdateOptions()).upsert(true)
)