Sie müssen die mehreren Schlüssel für $set
mit dem positionsbezogenen $
Betreiber
um beide übereinstimmenden Schlüssel zu aktualisieren.
Ich bevorzuge die moderne ES6-Art der Objektmanipulation:
let params = { "_id" : "xxxproductid", "name" : "xxx", "img" : "yyy" };
let update = [
{ 'store.products._id': params._id },
{ "$set": Object.keys(params).filter(k => k != '_id')
.reduce((acc,curr) =>
Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),
{ })
}
];
User.update(...update,callback);
Was den Aufruf von MongoDB als (mit mongoose.set('debug', true)
) erzeugen würde ) aktiviert, sodass wir die Anfrage sehen:
Wo im Grunde nehmen Sie Ihre Eingabe params
und geben Sie die _id
an als erstes Argument für die "Abfrage" :
{ 'store.products._id': params._id },
Der Rest nimmt die "Schlüssel" aus dem Objekt über Objekt.schlüssel
was ein "Array" erstellt, das wir mit Array.filter()
und dann an Array übergeben. reduzieren
um diese Schlüssel in ein Objekt
umzuwandeln .
Innerhalb des .reduce()
wir nennen Object.assign()
die Objekte mit den angegebenen Schlüsseln "verschmilzt", die in dieser Form generiert werden:
Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),
Verwenden der Vorlagensyntax, um den "aktuellen" (aktuellen) "Schlüssel" dem neuen Schlüsselnamen zuzuweisen, wiederum unter Verwendung von ES6-Schlüsselzuweisungssyntax []:
was Variablennamen in Objektliteralen erlaubt.
Das resultierende „zusammengeführte“ Objekt wird an das „Root“-Objekt zurückgegeben, wobei $set
wird für den Schlüssel des Updates verwendet, also sind die "erzeugten" Schlüssel nun Kinder davon.
Ich verwende ein Array für die Argumente nur zu Debugging-Zwecken, aber das ermöglicht auch eine sauberere Syntax für das eigentliche .update()
mit dem "Spread" ...
Operator zum Zuweisen der Argumente:
User.update(...update,callback);
Sauber und einfach, und einige JavaScript-Techniken, die Sie für die Objekt- und Array-Manipulation lernen sollten. Meistens, da die MongoDB-Abfrage DSL im Grunde "Objekte" und "Arrays" ist. Lerne also, sie zu manipulieren.