2015-07-17 17 views
6

Nelle versioni precedenti di driver MongoDB Java, per eseguire una query e fare upsert massa ordinata sul risultato tutto quello che dovevamo fare era:upsert Bulk con MongoDB Java 3.0 Driver

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

Ma nella versione 3, con l'introduzione del supporto Bson Document e il metodo MongoCollection.bulkWrite() come si può fare?

ho provato questo:

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

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

ma, ho bisogno della funzionalità upsert.

Grazie.

risposta

16

È comunque possibile utilizzare tutte le funzionalità, è solo che BulkWrites ora hanno una sintassi diversa:

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

in modo da utilizzare la UpdateOneModel (o per molti, se si desidera) e impostare il UpdateOptions come il terzo argomento al costruttore.

Ci vuole un po 'per abituarsi, ma fondamentalmente si tratta solo di costruire "elenchi" con la stessa sintassi che si trova altrove. Immagino che sia la ragione principale del cambiamento.

+0

C'è qualche documentazione ufficiale per questi cambiamenti nel driver? – void

+0

@AswinJoseRoy Esempi? No. Sfortunatamente tutti gli esempi di documentazione (almeno ufficiale) sembrano seguire le classi precedenti. Questa è la stessa storia per la maggior parte dei driver linguistici. Per quanto mi riguarda, ho trovato più informazioni cercando "GitHub" per "test" e simili nel repository. Ma ancora, alcuni "test" usano le classi più vecchie "ancora". Quindi alcuni sono tentativi ed errori. Migliorerà e domande come la tua in realtà aiutano. –

+0

Quando si inseriscono i dati alla prima volta, sia InsertCount che ModifiedCount di bulkWriteResult sono zero, si tratta di un bug? – inza9hi

0

Se si desidera qualcosa findAndModifyElseCreate(); Ciò significa che se il documento esiste, aggiornarlo, quindi crearlo e inserire i dati, quindi PER FAVORE SEGUI QUESTO.

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

Ecco l'esempio che utilizza l'ultimo 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(); 

la scheda a: http://ashutosh-srivastav-mongodb.blogspot.in/2017/09/mongodb-bulkwrite-java-api.html

+0

Funziona con l'ultima versione del driver Java mongo: 3.6.0-rc0 sul repository centrale. –

Problemi correlati