2015-07-17 4 views
6

В более ранних версиях драйверов MongoDB Java, чтобы выполнить запрос и сделать неупорядоченный насыпной upsert на результат все мы должны были сделать, это:Bulk Upsert с MongoDB Java 3.0 Driver

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

Но в версии 3, с введение поддержки Bson Document и метод MongoCollection.bulkWrite() как это можно сделать?

Я попытался это:

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

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

, но мне нужна функциональность upsert.

Спасибо.

ответ

16

Вы все еще можете использовать все функциональные возможности, это просто, что 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 в качестве третьего аргумент конструктору.

Приходит к привыканию, но в основном просто строит «Списки» со всем тем же синтаксисом, что и в других местах. Наверное, это основная причина этого изменения.

+0

Есть ли официальная документация для этих изменений в драйвере? – void

+0

Примеры @AswinJoseRoy? Нет. К сожалению, все примеры документации (по крайней мере, официальные), похоже, следуют старшим классам. Это одна и та же история для большинства языковых драйверов. Для меня я нашел дополнительную информацию, выполнив поиск «GitHub» для «тестов» и т. Д. В репозитории. Но опять же, некоторые «тесты» используют старые классы «все еще». Так что некоторые из них являются проб и ошибок. Будет лучше, и вопросы, подобные вашим, действительно помогут. –

+0

При вставке данных в первый раз, как insertCount, так и ModifiedCount of bulkWriteResult равны нулю, это ошибка? – inza9hi

0

Если вы хотите что-то найтиAndModifyElseCreate(); Это означает, что если документ существует, обновите его, затем создайте его и вставьте данные, затем ПОЖАЛУЙСТА, ПОСЛЕДУЙТЕ ЭТО.

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); 
4

Вот пример с использованием новейших интерфейсов API ..

for (Long entityId : entityIDs) { 

    //Finder doc 
    Document filterDocument = new Document(); 
    filterDocument.append("_id", entityId); 

    //Update doc 
    Document updateDocument = new Document(); 
    Document setDocument = new Document(); 
    setDocument.append("name", "xyz"); 
    setDocument.append("role", "abc"); 

    updateDocument.append("$set", setDocument); 

    //Update option 
    UpdateOptions updateOptions = new UpdateOptions(); 
    updateOptions.upsert(true); //if true, will create a new doc in case of unmatched find 
    updateOptions.bypassDocumentValidation(true); //set true/false 

    //Prepare list of Updates 
    updateDocuments.add(
      new UpdateOneModel<Document>(
        filterDocument, 
        updateDocument, 
        updateOptions)); 

} 

//Bulk write options 
BulkWriteOptions bulkWriteOptions = new BulkWriteOptions(); 
bulkWriteOptions.ordered(false); 
bulkWriteOptions.bypassDocumentValidation(true); 

MongoCollection<Document> mongoCollection = mongoDB.getCollection("myCollection"); 

BulkWriteResult bulkWriteResult = null; 
try { 
    //Perform bulk update 
    bulkWriteResult = mongoCollection.bulkWrite(updateDocuments, 
      bulkWriteOptions); 
} catch (BulkWriteException e) { 
    //Handle bulkwrite exception 
    List<BulkWriteError> bulkWriteErrors = e.getWriteErrors(); 
    for (BulkWriteError bulkWriteError : bulkWriteErrors) { 
     int failedIndex = bulkWriteError.getIndex(); 
     Long failedEntityId = entityIDs.get(failedIndex); 
     System.out.println("Failed record: " + failedEntityId); 
     //handle rollback 
    } 
} 

int rowsUpdated = bulkWriteResult.getModifiedCount(); 

Подробности по адресу: http://ashutosh-srivastav-mongodb.blogspot.in/2017/09/mongodb-bulkwrite-java-api.html

+0

Это работает для последней версии драйвера Java mongo: 3.6.0-rc0 на центральном репо. –

Смежные вопросы