MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie aktualisiere ich mehrere Felder eines Array-Objekts mit einer Anfrage?

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.