2016-04-02 6 views
1

Ich versuche, Code aus dem alten MongoDB-Treiber auf die neueste Version zu migrieren. In der alten Version hatten wir so etwas wie diese:Suchen und Upsert mit dem Java-Treiber

BasicDBObject query = new BasicDBObject("foo", "foo"); 
int value = 1; 
BasicDBObject field = new BasicDBObject("seq", value); 
BasicDBObject update = new BasicDBObject("$inc", field); 
DBObject o = getDBCollection().findAndModify(query, null, null, false, update, true, true); 

Wenn das ‚foo‘ Dokument dann nicht gäbe es geschaffen würde. Wenn es vorhanden wäre, würde der Wert von seq erhöht werden.

Von dem, was ich feststellen kann, das Gleiche zu tun mit MongoCollection Ich brauche replaceOne zu verwenden und etwas zu tun, wie folgt aus:

Document query = new Document("foo", "foo"); 
int value = 1; 
Document field = new Document("seq", value); 
Document update = new Document("$inc", field); 
UpdateOptions options = new UpdateOptions().upsert(true); 
UpdateResult ret = getMongoCollection().replaceOne(query, update, options); 

aber das gibt java.lang.IllegalArgumentException: Ungültige BSON Feldname $ inc

Antwort

1

Nein. Sie wollen .findOneAndUpdate():

FindOneAndUpdateOptions options = new FindOneAndUpdateOptions() 
    .upsert(true) 
    .returnDocument(ReturnDocument.AFTER); 

UpdateResult ret = getMongoCollection().findOneAndUpdate(query, update, options); 

Die .replaceOne() bedeuten genau das und „ersetzt“ das gesamte Dokument (mit Ausnahme der _id) mit dem Inhalt zur Verfügung gestellt. Das heißt, Modifikatoren wie $inc sind hier nicht erlaubt.

Sie verwenden also stattdessen .findOneAndUpdate(). Beachten Sie, dass Sie wahrscheinlich ReturnDocument.AFTER das "geänderte" Dokument anstelle des "ursprünglichen" Dokuments zurückgeben möchten, bevor das Update angewendet wurde, was die Standardaktion wäre.

+0

Das hat funktioniert - danke. Ich hatte früher versucht, findOneAndUpdate zu verwenden, aber ich hatte diese Optionen nicht; Das war der Ausschlag. –