Javaドライバーを使用してデータをmongodbコレクションにアップサートするにはどうすればよいですか?
私は試します(空のコレクションで):
db.getCollection(collection).update(new BasicDBObject("_id", "12"), dbobject, true, false);
しかし、ドキュメントは_id == ObjectID(...)で作成されました。 「12」の値ではありません。
このコード(js)は、期待どおりに_id = "12"のドキュメントを追加します
db.metaclass.update(
{ _id:12},
{
$set: {b:1}
},
{ upsert: true }
)
mongo-Java-driver-2.11.2
dbobject
が単なるドキュメントであり、更新演算子が含まれていない場合は、_id
を設定できません(例:$set
、$setOnInsert
)。
ドキュメントを渡すだけでドキュメント全体が置き換えられます。つまり、_id
が設定されず、ObjectId
にフォールバックされます。
したがって、更新演算子を使用すると、例は機能します。例:
db.getCollection(collection).update(
new BasicDBObject("_id", "12"),
new BasicDBObject("$set", new BasicDBObject("Hi", "world")), true, false)
mongo-Java driver を使用している場合、.updateOne()
メソッドを{upsert, true}
フラグが機能します。
void setLastIndex(MongoClient mongo, Long id, Long lastIndexValue) {
Bson filter = Filters.eq("_id", id);
Bson update = new Document("$set",
new Document()
.append("lastIndex", lastIndexValue)
.append("created", new Date()));
UpdateOptions options = new UpdateOptions().upsert(true);
mongo.getDatabase(EventStreamApp.EVENTS_DB)
.getCollection(EventCursor.name)
.updateOne(filter, update, options);
}
This is to upsert with scala driver which i couldnot find in web
con.updateOne(
equal("vendor_id", vendorId),
inc("views_count", f.views),
UpdateOptions().upsert(true))
to do so import the following
import org.mongodb.scala.model.UpdateOptions
replaceOne
メソッドを使用してReplaceOptions
を指定できます(3.7以降)。
private static final ReplaceOptions REPLACE_OPTIONS
= ReplaceOptions.createReplaceOptions(new UpdateOptions().upsert(true));
db.getCollection(collection).replaceOne(new BasicDBObject("_id", "12"), dbobject, REPLACE_OPTIONS);
古いバージョンの場合、UpdateOptions
をreplaceOneメソッドに直接渡すことができます。
private static final UpdateOptions UPDATE_POLICY = new UpdateOptions().upsert(true);
db.getCollection(collection).replaceOne(new BasicDBObject("_id", "12"), dbobject, UPDATE_POLICY);
documentation で述べたように:
replaceOne()は、置換ドキュメントを使用して、フィルターに一致するコレクション内で最初に一致したドキュメントを置き換えます。
Upsert:trueで、フィルターに一致するドキュメントがない場合、replaceOne()は、置換ドキュメントに基づいて新しいドキュメントを作成します。