Wie kann ich ein Objekt in MongoDB teilweise aktualisieren, sodass das neue Objekt mit dem vorhandenen Objekt überlagert / zusammengeführt wird?
Angesichts dieser gespeicherte Dokumente werden in MongoDB
{
_id : ...,
some_key: {
param1 : "val1",
param2 : "val2",
param3 : "val3"
}
}
Ein Objekt mit neuen Informationen über param2
und param3
von der Außenwelt braucht, um gerettet zu werden
var new_info = {
param2 : "val2_new",
param3 : "val3_new"
};
Möchte ich verbinden /überlagern sich die neuen Felder in den vorhandenen Zustand des Objekts, so dass param1 nicht entfernt
Tun dies
db.collection.update( { _id:...} , { $set: { some_key : new_info } }
Führen zu MongoDB ist dabei genau so, wie es gefragt wurde, und setzt some_key auf diesen Wert. ersetzen Sie die alte.
{
_id : ...,
some_key: {
param2 : "val2_new",
param3 : "val3_new"
}
}
Was ist der Weg, um MongoDB update nur neue Felder (ohne Angabe Sie eins nach dem anderen explizit)? um dies zu erhalten:
{
_id : ...,
some_key: {
param1 : "val1",
param2 : "val2_new",
param3 : "val3_new"
}
}
Ich bin mit dem Java-client, aber jedes Beispiel, wird geschätzt
InformationsquelleAutor der Frage Eran Medan | 2012-04-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich verstehe die Frage richtig, das Sie aktualisieren möchten ein Dokument mit dem Inhalt eines anderen Dokuments, sondern nur die Felder, die noch nicht vorhanden sind, und völlig ignorieren die Felder, die bereits eingestellt sind (wenn auch in einem anderen Wert).
Gibt es keine Möglichkeit zu tun, die in einem einzigen Befehl.
Müssen Sie der Abfrage das Dokument zuerst, herauszufinden, was Sie wollen
$set
und aktualisieren Sie es dann (mit den alten Werten einen passenden filter, um sicherzustellen, dass Sie nicht bekommen, gleichzeitige updates dazwischen).Anderen das Lesen deiner Frage würde sein, dass Sie glücklich mit
$set
wollen aber nicht explizit alle Felder. Wie würden Sie übergeben die Daten dann?Wissen Sie, Sie können Folgendes tun:
InformationsquelleAutor der Antwort Thilo
Löste ich es mit meiner eigenen Funktion. Wenn Sie möchten, zu aktualisieren angegebene Feld im Dokument, das Sie brauchen, um es klar zu sagen.
Beispiel:
Wenn Sie aktualisieren möchten, param2 nur, es falsch zu machen:
Müssen Sie:
Also schrieb ich eine Funktion so ähnlich:
InformationsquelleAutor der Antwort mehmatrix
Können Sie die dot-notation zugreifen und Felder, tief im Innern von Objekten, ohne die anderen Eigenschaften dieser Objekte.
Gegeben, das Objekt, das Sie oben angegeben:
Können wir update nur
some_key.param2
undsome_key.param3
:Können Sie Tauchen so tief, wie Sie möchten. Dies ist auch nützlich für das hinzufügen von neuen Eigenschaften eines Objekts ohne Einfluss auf die bestehenden.
InformationsquelleAutor der Antwort Samir Talwar
Mongo können Sie eine Aktualisierung geschachtelte Dokumente mit einem
.
Konvention. Werfen Sie einen Blick: Aktualisierung geschachtelte Dokumente in mongodb. Hier eine weitere Frage aus der Vergangenheit über einen merge-update, wie die, die du suchst, glaube ich: MongoDB atomic update per 'merge' - DokumentInformationsquelleAutor der Antwort Pavel Veller
Die beste Lösung ist, um Eigenschaften zu extrahieren, von Objekt und machen Sie Sie flach dot-notation-Schlüssel /Wert-Paaren. Könnten Sie dies beispielsweise für die Bibliothek:
https://www.npmjs.com/package/mongo-dot-notation
Es hat
.flatten
Funktion, die Ihnen erlaubt zu ändern Objekt in flachen Satz von Eigenschaften, die wäre dann gegeben $set modifier, ohne sorgen, dass jede Eigenschaft Ihrer bestehenden DB-Objekt werden gelöscht/überschrieben, ohne not.Entnommen
mongo-dot-notation
docs:Dann bildet es die perfekte Auswahl - es wird aktualisiert, NUR bestimmten Eigenschaften.
EDIT: ich mag Archäologe einige Male 😉
InformationsquelleAutor der Antwort SzybkiSasza
Sieht es aus wie Sie können isPartialObject das könnte zu erreichen, was Sie wollen.
InformationsquelleAutor der Antwort Patrick Tescher
Hatte ich Erfolg, es zu tun auf diese Weise:
Ich habe eine Funktion, die Griffe meiner Profil updates dynamisch
Hinweis: 'Profil' ist spezifisch für meine Anwendung, es ist nur die Zeichenfolge des Schlüssels, den Sie ändern möchten.
InformationsquelleAutor der Antwort Matt Smith
$gesetzt, machen diesen Prozess
InformationsquelleAutor der Antwort KARTHIKEYAN.A
Machen Sie ein update-Objekt mit den Eigenschaftennamen, einschließlich der erforderlichen dot Pfad. ("somekey."+ von OP ' s Beispiel), und verwenden Sie dann, dass das update durchführen.
InformationsquelleAutor der Antwort Andrew
Wenn Sie mehrere Felder aktualisiert werden
InformationsquelleAutor der Antwort Vino
In Mongo 3.6 gibt es eine Funktion mergeObjects tut genau das, was Sie brauchen:
https://docs.mongodb.com/manual/reference/operator/aggregation/mergeObjects/
InformationsquelleAutor der Antwort Tim Babych