MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment utiliser la notation $set et point pour mettre à jour les éléments de tableau intégrés à l'aide de l'ancien élément correspondant ?

Si le champ est membre d'un tableau en le sélectionnant, vous les sélectionnez tous.

{ar :[{"a" : 1}, {"a" : 2}]}

"$ar.a" = [1 ,2]

De plus, vous ne pouvez pas mélanger les opérateurs de mise à jour avec l'agrégation, vous ne pouvez pas utiliser des choses comme $sites.$.energy_consumption , si vous faites de l'agrégation, vous devez utiliser des opérateurs d'agrégation, à la seule exception du $match étape où vous pouvez utiliser des opérateurs de requête.

Requête

  • solution alternative légèrement différente de la vôtre en utilisant $setField
  • je suppose que ce sera plus rapide, mais probablement peu de différence
  • pas besoin d'utiliser javascript, ce sera plus lent
  • c'est>=la solution MongoDB 5, $setField est un nouvel opérateur

Code de test ici

aggregate(
[{"$set":
  {"sites":
   {"$map":
    {"input":"$sites",
     "in":
     {"$setField":
      {"field":"new_field",
       "input":"$$this",
       "value":"$$this.energy_consumption"}}}}}}]
)