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

Subdocumento agregado/projeto como documento de nível superior no mongo


Quando você tem muitos campos no subdocumento e ocasionalmente ele é atualizado com novos campos, a projeção não é uma opção viável. Felizmente, desde a versão 3.4, o MongoDB tem um novo operador chamado $replaceRoot .

Tudo o que você precisa fazer é adicionar um novo estágio no final do seu pipeline.
db.getCollection('sample').aggregate([
    {
        $replaceRoot: {newRoot: "$command"}
    },
    {
        $project: {score: 0 } //exclude score field
    }
])

Isso lhe daria a saída desejada.

Observe que, em caso de agregação (especialmente após um $group stage) o documento 'comando' pode ser uma matriz e pode conter vários documentos. Nesse caso, você precisa $unwind o array primeiro para poder usar $replaceRoot .