web-dev-qa-db-ja.com

mongodb-Java-driverでアップサートする方法

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

18
user1312837

dbobjectが単なるドキュメントであり、更新演算子が含まれていない場合は、_idを設定できません(例:$set$setOnInsert)。

ドキュメントを渡すだけでドキュメント全体が置き換えられます。つまり、_idが設定されず、ObjectIdにフォールバックされます。

したがって、更新演算子を使用すると、例は機能します。例:

db.getCollection(collection).update(
    new BasicDBObject("_id", "12"), 
    new BasicDBObject("$set", new BasicDBObject("Hi", "world")), true, false)
17
Ross

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);
  }
19
prayagupd
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
0
chandu

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()は、置換ドキュメントに基づいて新しいドキュメントを作成します。

0
M3HD1