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 aplicarsnapshot()
para o cursor antes de recuperar qualquer documento do banco de dados. Você só pode usarsnapshot()
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.