sql >> Database >  >> NoSQL >> MongoDB

Hoe meerdere velden van een array-object bij te werken met één verzoek?

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.



  1. MongoDB-indexen begrijpen

  2. Retourneer specifieke array uit objectverzameling

  3. Binnen de nieuwe ondersteuning van Apache HBase voor MOB's

  4. Automatische nieuwe pogingen