MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como usar $ set e notação de ponto para atualizar elementos de matriz incorporados usando o elemento antigo correspondente?


Se o campo for membro de um array ao selecioná-lo, você está selecionando todos eles.
{ar :[{"a" : 1}, {"a" : 2}]}

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

Além disso, você não pode misturar operadores de atualização com agregação, você não pode usar coisas como $sites.$.energy_consumption , se você estiver fazendo agregação, terá que usar operadores agregados, com exceção do $match estágio em que você pode usar operadores de consulta.

Consulta
  • solução alternativa ligeiramente diferente da sua usando $setField
  • acho que será mais rápido, mas provavelmente pouca diferença
  • não há necessidade de usar javascript, será mais lento
  • esta é>=solução MongoDB 5, $setField é novo operador

Teste o código aqui
aggregate(
[{"$set":
  {"sites":
   {"$map":
    {"input":"$sites",
     "in":
     {"$setField":
      {"field":"new_field",
       "input":"$$this",
       "value":"$$this.energy_consumption"}}}}}}]
)