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

Como renomear um campo dentro de um array com comandos de banco de dados?

  • O erro diz $map 's input aceita campo de referência usando $ assinar $version ,
  • coloque o u objeto no colchete de matriz para atualizar com um pipeline de agregação
  • basta colocar os dois campos title e version em $map
  • $unset não é necessário porque $map irá substituir os dados antigos por novos campos em in
db.runCommand({
    update: 'apps',
    updates: [
        {
            q: { "versions.name": { $exists: true } },
            u: [{
                $set: {
                    versions: {
                        $map: {
                            input: "$versions",
                            in: {
                                "title": "$$this.name",
                                "version": "$$this.version"
                            }
                        }
                    }
                }
            }],
            multi: true
        }
    ]
})

Playground

Segunda maneira, para uma abordagem mais dinâmica
  • $mergeObjects dentro de $map , para evitar a lista manual de pares de valores-chave
  • $unset estágio para remover name campo de version matriz
db.runCommand({
    update: 'apps',
    updates: [
        {
            q: { "versions.name": { $exists: true } },
            u: [
              {
                $set: {
                    versions: {
                        $map: {
                            input: "$versions",
                            in: {
                                $mergeObjects: [
                                    "$$this",
                                    { "title": "$$this.name" }
                                ]
                            }
                        }
                    }
                }
              },
              { $unset: "versions.name" }
            ],
            multi: true
        }
    ]
})

Playground