Wie an einem einfachen Beispiel: Dokument in MongoDB Java driver 3
was ist die idiomatischen Weg zu einem einfachen Beispiel: ein Dokument mit version 3 des mongodb-java-Treiber (speziell die v3.0.1)?
Haben wir eine Sammlung für Sitzungen und, wenn eine neue Sitzung wird angelegt oder geändert werden können, wollen wir an einem einfachen Beispiel: in einem Betrieb anstatt zur Abfrage, ob ein Dokument existiert und dann entweder einfügen oder ersetzen.
Unserer alten upsertion code die scala-Treiber casbah 2.7.3. Es sah aus wie:
import com.mongodb.casbah.MongoCollection
import com.mongdb.DBObject
val sessionCollection: MongoCollection = ...
val sessionKey: String = ...
val sessionDocument: DBObject = ... //Either create a new one, or find and modify an existing one
sessionCollection.update(
"_id" -> sessionKey,
sessionDocument
upsert = true
)
In unserem aktuellen Projekt sind wir nur mit der reinen java-3.0.1-Treiber und wir sind mit BsonDocument
statt DBObject
zu machen, mehr typsafe. Ich habe versucht ersetzen Sie das oben mit so etwas wie:
import com.mongodb.client.MongoCollection
val sessionCollection: MongoCollection = ...
val sessionKey: String = ...
val sessionDocument: BsonDocument = //Either create a new one, or find and modify an existing one
val updateOptions = new UpdateOptions
updateOptions.upsert(true)
sessionCollection.updateOne(
"_id" -> new BsonString(sessionKey),
sessionDocument,
updateOptions
)
Dies wirft den Fehler "java.lang.IllegalArgumentException: Ungültige BSON-Feldnamen ...". Der Fehler ist bedeckt diese Frage aber die op in dieser Frage, gar nicht versucht, an einem einfachen Beispiel: in einem Betrieb - Sie wurden mit Hilfe von Kontext, um zu entscheiden, ob zu ersetzen/aktualisieren/einfügen etc...
Ich bin glücklich mit dem, code-Beispiele in scala oder java.
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Mongo-Java-Treiber 3.0 Serie haben wir eine neue Crud API, das ist eindeutiger und daher Anfänger-freundlich. Diese initiative wurde ausgerollt über mehrere MongoDB-Treiber, aber es enthält einige änderungen im Vergleich zu den älteren API.
Als Sie nicht aktualisieren Sie ein vorhandenes Dokument mit einem update-operator, die
updateOne
- Methode ist nicht geeignet.Dem Vorgang, den Sie beschreiben, ist ein
replaceOne
Betrieb und ausgeführt werden können, etwa so:replaceOne
tut nur das letztere. Wenn ich dein code-snippet, um zu versuchen und legen Sie eine frische Sitzung in der Datenbank, ist es natürlich wiederAcknowledgedUpdateResult{matchedCount=0, modifiedCount=null, upsertedId=null}
und hat keine Auswirkungen auf die Datenbank.replaceOne
Methode.new UpdateOptions
- ie. ändern Sie es zu(new UpdateOptions).upsert(true)
. Da es sonst nicht kompiliert.