U moet de meerdere sleutels leveren aan $set
met de positionele $
operator
om beide overeenkomende sleutels bij te werken.
Ik geef de voorkeur aan de moderne ES6-manier van objectmanipulatie:
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);
Wat de aanroep naar MongoDB zou opleveren als ( met mongoose.set('debug', true)
) ingeschakeld zodat we het verzoek zien:
Waar je in principe je invoer params
neemt en geef de _id
. op als het eerste argument voor de "query" :
{ 'store.products._id': params._id },
De rest haalt de "sleutels" van het object via Object.keys
die een "array" maakt die we kunnen "filteren" met Array.filter()
en ga dan door naar Array.reduce
om die sleutels om te zetten in een Object
.
Binnen de .reduce()
we noemen Object.assign()
die objecten "samenvoegt" met de gegeven sleutels, gegenereerd in deze vorm:
Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),
Gebruik de sjabloonsyntaxis om de "huidige" (curr) "sleutel" toe te wijzen aan de nieuwe sleutelnaam, opnieuw met behulp van de syntaxis voor toewijzing van ES6-sleutels []:
waarmee variabelenamen in letterlijke objecten worden toegestaan.
Het resulterende "samengevoegde" object wordt teruggestuurd om te worden toegewezen aan het "root" -object waar $set
wordt gebruikt voor de sleutel van de update, dus de "gegenereerde" sleutels zijn daar nu kinderen van.
Ik gebruik een array voor de argumenten puur voor foutopsporingsdoeleinden, maar dat maakt ook een schonere syntaxis mogelijk op de daadwerkelijke .update()
met behulp van de "spread" ...
operator om de argumenten toe te wijzen:
User.update(...update,callback);
Schoon en eenvoudig, en enkele JavaScript-technieken die u zou moeten leren voor het manipuleren van objecten en arrays. Vooral omdat de MongoDB-query DSL in feite "Objects" en "Arrays" is. Dus leer ze te manipuleren.