12

以前のバージョンの MongoDB Java ドライバーでは、クエリを実行し、結果に対して順序付けされていない一括 upsert を実行するには、次のことを行うだけでした。

BulkWriteOperation bulk = dbCollection.initializeUnorderedBulkOperation();
    bulk.find(searchQuery).upsert().update(new BasicDBObject("$set", getDbObjectModel()));

しかし、バージョン 3 では、Bson ドキュメントのサポートと MongoCollection.bulkWrite() メソッドの導入により、これをどのように行うことができるでしょうか?

私はこれを試しました:

List<WriteModel<Document>> documentList = new ArrayList<>();

collection.bulkWrite(documentList, new BulkWriteOptions().ordered(false));

しかし、アップサート機能が必要です。

ありがとう。

4

3 に答える 3

26

BulkWrites の構文が異なるだけで、すべての機能を引き続き使用できます。

    MongoCollection<Document> collection = db.getCollection("sample");

    List<WriteModel<Document>> updates = Arrays.<WriteModel<Document>>asList(
        new UpdateOneModel<Document>(
                new Document(),                   // find part
                new Document("$set",1),           // update part
                new UpdateOptions().upsert(true)  // options like upsert
        )
    );

    BulkWriteResult bulkWriteResult = collection.bulkWrite(updates);

したがって、UpdateOneModel( または必要に応じて多くの場合 ) を使用UpdateOptionsし、コンストラクターの 3 番目の引数として を設定します。

慣れるまで少し時間がかかりますが、基本的には、他の場所と同じ構文で「リスト」を作成するだけです。それが変更の主な理由だと思います。

于 2015-07-17T08:08:27.390 に答える
0

何かが必要な場合は、findAndModifyElseCreate(); つまり、ドキュメントが存在する場合は更新し、そうでない場合はドキュメントを作成してデータを挿入してから、これに従ってください。

BasicDBObject insertInCaseDocumentNotFound = new BasicDBObject();


insertInCaseDocumentNotFound.put("field1", "value1");
insertInCaseDocumentNotFound.put("date", new Date());


MongoCollection<BasicDBObject> table = db.getCollection("collectionName",BasicDBObject.class);

BasicDBObject updateObject = new BasicDBObject();

updateObject.append("$setOnInsert", new BasicDBObject());
updateObject.append("$set", new BasicDBObject("date",new Date());

List<WriteModel<BasicDBObject>> updates = Arrays.<WriteModel<BasicDBObject>> asList(
                new UpdateOneModel<BasicDBObject>(new BasicDBObject("search_name", alert.getString("search_name")), // query for which we need to apply

                        updateObject, // update the document in case it is found
                        new UpdateOptions().upsert(true) // upsert to insert new data in case document is not found
        ));
table.bulkWrite(updates);
于 2016-06-03T08:45:15.920 に答える