2016-12-15 3 views
0

Ich habe Sammlung unter Datenstruktur mitaktualisieren oder erstellen, wenn nicht Mongo existiert 3.0.4

{ "Shop": "123", "date": "28-05-2015", "Points": { "a": "1", "b": "2", "c": "3" } }

Hier Geschäft und Datum eindeutiger Indizes hat und keine ID gibt es außer _id, Also, wenn ich will Aktualisiere nur den b-Wert und wenn der Datensatzvergleich (basierend auf Konto und Datum) nicht da ist, sollte ein neuer Datensatz mit derselben Struktur mit dem b-Wert erstellt werden. Der wichtigste Teil ist die Bulk-Operation bedeutet, dass ich Datensatz pro Tag für alle Shops erstellen/aktualisieren muss und diese Aufzeichnung wird für jeden Shop pro Tag erstellt. So während ein Punkt aktualisieren, wenn Datensatz nicht da ist, erstellen Sie es sonst aktualisieren existierender Rekord. Ich verwende Frühling. Ich habe versucht, update mit upsert true zu verwenden, aber es wird nicht aktualisiert, sondern erstellt einen neuen Datensatz mit nur aktualisierten Wert. Und was ist der beste Weg, mehrere Geschäfte mit gegebenen aktualisierten Punkten zu aktualisieren.

+0

können Sie den Upsert Code hier posten. –

+0

Ich machte es auf der Mongo Shell selbst. mit update-Abfrage mit umwerfen Flag als ein wahrer ... in Mongo 3.4 gibt $ set flag in Update, die funktionierte, aber es ist nicht in 3.0. Ich werde den Code in wenigen Stunden aktualisieren. –

+0

Ich werde einen Beispielcode hinzufügen, den Sie gegen Ihren Code verifizieren können. –

Antwort

0
//search a document that doesn't exist 
Query query = new Query(); 
query.addCriteria(Criteria.where("points.b").is("some value")); 

Update update = new Update(); 
update.set("b", some value); 
update.set..... //set all needed fields else they go as null 

mongoOperation.upsert(query, update, Shop.class); 

Shop shopTestObj = mongoOperation.findOne(query, Shop.class); 
System.out.println("shopTestObj - " + shopTestObj); 

bei Massenbetrieb

// Sample code 
com.mongodb.DBCollection collection = db.getCollection("shop"); 

// Get BulkWriteOperation by accessing the mongodb com.mongodb.DBCollection class on mycol //Collection 

BulkWriteOperation bulkWriteOperation= collection.initializeUnorderedBulkOperation(); 

//perform the upsert operation in the loop to add objects for bulk execution 
for (int i=0;i<100;i++) 
{ 
// get a bulkWriteRequestBuilder by issuing find on the shop with _id 
BulkWriteRequestBuilder bulkWriteRequestBuilder=bulkWriteOperation.find(new BasicDBObject('_id',Integer.valueOf(i))); 

// get hold of upsert operation from bulkWriteRequestBuilder 
BulkUpdateRequestBuilder updateReq=    bulkWriteRequestBuilder?.upsert() 

updateReq. replaceOne (new BasicDBObject("_id",Integer.valueOf(i)).append("points.b", "some value")); 

} 
// execute bulk operation on shop collection 
BulkWriteResult result=bulkWriteOperation.execute(); 
+0

Gibt es einen Grund, dass BulkWriteRequestBuilder auf _id basiert oder upsert auf _id? –

+0

das ist nur ein Beispiel. –

+0

Ich habe den oberen Teil ohne Bulk-Update .Kannst erklären Bulk-Update-Teil und wenn ich eine Liste von Objekten habe und Sagen Shop und Datum ist einzigartig, so dass ich UPOATE a, b nur als, wie dies funktioniert und auch Sie sind Verwenden von BasicDBObject, Wie kann ich meine Objekte anstelle von –

Verwandte Themen