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

MongoDB renomeia campo de banco de dados dentro do array


Por que vale a pena, embora pareça horrível ter que fazer, a solução é realmente muito fácil. Isso, claro, depende de quantos registros você tem. Mas aqui está o meu exemplo:
db.Setting.find({ 'Value.Tiers.0.AssetsUnderManagement': { $exists: 1 } }).snapshot().forEach(function(item)
{    
    for(i = 0; i != item.Value.Tiers.length; ++i)
    {
        item.Value.Tiers[i].Aum = item.Value.Tiers[i].AssetsUnderManagement;
        delete item.Value.Tiers[i].AssetsUnderManagement;
    }
    
    db.Setting.update({_id: item._id}, item);
});

Eu itero sobre minha coleção onde a matriz é encontrada e o nome "errado" é encontrado. Em seguida, faço uma iteração sobre a subcoleção, defino o novo valor, excluo o antigo e atualizo todo o documento. Foi relativamente indolor. É verdade que tenho apenas algumas dezenas de milhares de linhas para pesquisar, das quais apenas algumas dezenas atendem aos critérios.

Ainda assim, espero que esta resposta ajude alguém!

Editar:Adicionado snapshot() à consulta. Veja o porquê nos comentários.

Você deve aplicar snapshot() para o cursor antes de recuperar qualquer documento do banco de dados. Você só pode usar snapshot() com coleções não fragmentadas.

Do MongoDB 3.4, snapshot() função foi removida. Portanto, se estiver usando o Mongo 3.4+, o exemplo acima deve remover snapshot() função.