web-dev-qa-db-ja.com

MongoDBでドキュメントをアップサートする方法Javaドライバー3

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のコードサンプルに満足しています。

ありがとう!

10
rmin

Mongo Java Driver 3.0シリーズでは、より明確で初心者に優しい新しいCrud APIを追加しました。このイニシアチブは多くのMongoDBドライバーに展開されていますが、いくつかの変更点が比較されています古いAPIに。

更新演算子 を使用して既存のドキュメントを更新していないため、updateOneメソッドは適切ではありません。

説明する操作は replaceOne 操作であり、次のように実行できます。

sessionCollection.replaceOne(
    "_id" -> new BsonString(sessionKey),
    sessionDocument,
    (new UpdateOptions()).upsert(true)
)
13
Ross