Wie durchführen einer Massenaktualisierung von Dokumenten in MongoDB mit Java
Ich bin mit MongoDB 3.2 und MongoDB-Java-Treiber 3.2. Ich habe ein array von ein paar Hunderten von aktualisierten Dokumenten, die sollten jetzt gespeichert/abgelegt in MongoDB. Damit zu tun, dass ich die Iteration über das array und rufen Sie für jedes Dokument, das in dieses array die updateOne()
Methode.
Nun, ich möchte zu re-implementieren diese Logik mit einem bulk-update. Ich habe versucht zu finden ein Beispiel für Massen-Updates in MongoDB 3.2 mit MongoDB-Java-Treiber 3.2.
Ich habe versucht, diesen code:
MongoClient mongo = new MongoClient("localhost", 27017);
DB db = (DB) mongo.getDB("test1");
DBCollection collection = db.getCollection("collection");
BulkWriteOperation builder = collection.initializeUnorderedBulkOperation();
builder.find(new BasicDBObject("_id", 1001)).upsert()
.replaceOne(new BasicDBObject("_id", 1001).append("author", "newName"));
builder.execute();
Aber es scheint, dass dieser Ansatz basiert auf einem veralteten MongoDB-Java-Treiber, wie 2,4-und nutzt deprecated-Methoden.
Meine Frage:
Wie durchführen einer Massenaktualisierung von Dokumenten in MongoDB 3.2 mit MongoDB-Java-Treiber 3.2?
- Blick auf die detaillierte Beispiel stackoverflow.com/a/39356860/4437074
Du musst angemeldet sein, um einen Kommentar abzugeben.
Unter Verwendung des Beispiels in der Anleitung auf die neue
bulkWrite()
API, sollten Sie die folgenden test-Sammlung, die enthält die folgenden Dokumente:Den folgenden
bulkWrite()
führt mehrere Operationen auf dencharacters
Sammlung:Mongo shell:
dem Drucke der Ausgabe:
Die äquivalente Java-3.2 Implementierung folgt:
Für Ihre Frage verwenden Sie die
replaceOne()
Methode und würde dies umgesetzt, wieMongoDB
? Ich meine von der Menge der Dokumente, Punkt der Regel. 2. In Bezug aufreplaceOne()
alle meine aktualisierte Dokumente enthalten, ein update von ein-zwei Felder. Warum soll ich diese Methode verwenden und nichtupdateOne()
? Soweit ich das verstanden habe,replaceOne()
ersetzt das gesamte Dokument, währendupdateOne()
können Sie einfach aktualisieren Sie den Wert des bestimmten Feldern, die schneller sein soll, hab ich Recht?replaceOne
ersetzt ein einzelnes Dokument in der Sammlung entspricht dem filter. Wenn mehrere Dokumente matchreplaceOne
wird, ersetzen Sie die erste übereinstimmenden Dokumente nur.updateOne()
updates ein einzelnes Dokument innerhalb der collection auf dem filter basiert. Wenn{upsert: true}
- option angegeben ist und keine Dokumente, die dem filter entsprechen, wird ein neues Dokument erzeugt werden, indem die Vergleiche auf Gleichheit im filter mit den änderungen von update. Wenn der filter nur Vergleichsoperationen, dann werden nur die änderungen aus dem update wird angewendet, um das neue Dokument.collection.bulkWrite(write, new BulkWriteOptions().ordered(false));