Definição
- $redact
- Restringe a saída de documentos inteiros ou conteúdo dentro de documentos com base nas informações armazenadas nos próprios documentos. - O estágio - $redacttem a seguinte forma de protótipo:- { $redact: <expression> } - O argumento pode ser qualquerexpressão válida, desde que se resolva para as variáveis de sistema - $$DESCEND,- $$PRUNEou- $$KEEP. Para mais informações sobre expressões, consulte Expressões.Variável do sistemaDescrição- $$DESCEND
 - $$PRUNE
 - $redactexclui todos os campos no nível do documento/ documento incorporado atual, sem inspeção adicional de qualquer um dos campos excluídos. Isso se aplica mesmo que o campo excluído contenha documentos incorporados que possam ter diferentes níveis de acesso.- $$KEEP
 - $redactretorna ou mantém todos os campos no nível de documento/ documento incorporado atual, sem inspeção adicional dos campos desse nível. Isso se aplica mesmo que o campo incluído contenha documentos incorporados que possam ter diferentes níveis de acesso.
Exemplos
Os exemplos nessa seção usam o auxiliar db.collection.aggregate().
Avalie o acesso em todos os níveis de documento
Uma collection forecasts contém documentos do seguinte formulário onde o campo tags lista os diferentes valores de acesso desse nível de documento/documento incorporado; ou seja, um valor de [ "G", "STLW" ] especifica que "G" ou "STLW" podem acessar os dados:
db.forecasts.insertOne(    {       _id: 1,       title: "123 Department Report",       tags: [ "G", "STLW" ],       year: 2014,       subsections: [          {          subtitle: "Section 1: Overview",          tags: [ "SI", "G" ],          content:  "Section 1: This is the content of section 1."          },          {          subtitle: "Section 2: Analysis",          tags: [ "STLW" ],          content: "Section 2: This is the content of section 2."          },          {          subtitle: "Section 3: Budgeting",          tags: [ "TK" ],          content: {             text: "Section 3: This is the content of section 3.",             tags: [ "HCS" ]          }          }       ]    } ) 
Um usuário tem acesso para ver informações com a tag "STLW" ou "G". Para executar uma query em todos os documentos com o ano 2014 para esse usuário, inclua um estágio $redact como a seguir:
var userAccess = [ "STLW", "G" ]; db.forecasts.aggregate(    [    { $match: { year: 2014 } },    { $redact: {       $cond: {          if: { $gt: [ { $size: { $setIntersection: [ "$tags", userAccess ] } }, 0 ] },          then: "$$DESCEND",          else: "$$PRUNE"          }       }    }    ] ); 
A operação de aggregation retorna o seguinte documento "editado":
{    _id: 1,    title: "123 Department Report",    tags: [ "G", "STLW" ],    year: 2014,    subsections: [       {       subtitle: "Section 1: Overview",       tags: [ "SI", "G" ],       content: "Section 1: This is the content of section 1."       },       {       subtitle: "Section 2: Analysis",       tags: [ "STLW" ],       content : "Section 2: This is the content of section 2."       }    ] } 
Excluir todos os campos de um determinado nível
Uma collection accounts contém o seguinte documento:
db.accounts.insertOne(    {       _id: 1,       level: 1,       acct_id: "xyz123",       cc: {          level: 5,          type: "yy",          num: 000000000000,          exp_date: ISODate("2015-11-01T00:00:00.000Z"),          billing_addr: {          level: 5,          addr1: "123 ABC Street",          city: "Some City"          },          shipping_addr: [          {             level: 3,             addr1: "987 XYZ Ave",             city: "Some City"          },          {             level: 3,             addr1: "PO Box 0123",             city: "Some City"          }          ]       },       status: "A"    } ) 
Nesse documento de exemplo, o campo level determina o nível de acesso necessário para visualizar os dados.
Para executar uma query em todos os documentos com status A e excluir todos os campos contidos em um documento/documento incorporado no nível 5, inclua uma etapa $redact que especifique a variável do sistema "$$PRUNE" no campo then:
db.accounts.aggregate(    [       { $match: { status: "A" } },       {          $redact: {          $cond: {             if: { $eq: [ "$level", 5 ] },             then: "$$PRUNE",             else: "$$DESCEND"          }          }       }    ] ); 
O estágio $redact avalia o campo level para determinar o acesso. Se o campo level for igual a 5, exclua todos os campos desse nível, mesmo que o campo excluído contenha documentos incorporados que possam ter valores de level diferentes, como o campo shipping_addr.
A operação de aggregation retorna o seguinte documento "editado":
{    _id: 1,    level: 1,    acct_id: "xyz123",    status: "A" } 
O conjunto de resultados mostra que o estágio $redact excluiu o campo cc como um todo, incluindo o campo shipping_addr que continha documentos incorporados que tinham level valores de campo iguais a 3 e não 5.
Dica
Implemente a edição no nível do campo para etapas de configuração de múltiplas combinações de acesso para os mesmos dados.
Os exemplos do Node.js nesta página utilizam o banco de dados do sample_mflix a partir dos conjuntos de dados de amostra do Atlas. Para saber como criar um cluster gratuito do MongoDB Atlas e carregar os conjuntos de dados de exemplo, consulte Introdução na documentação do driver do MongoDB Node.js
Para usar o driver Node.js do MongoDB para adicionar um estágio $redact a um pipeline de agregação , use o operador $redact em um objeto de pipeline.
O exemplo a seguir cria um estágio de pipeline que mantém documentos nos quais o valor do campo imdb.rating é maior ou igual a 9. O estágio exclui todos os outros documentos. Em seguida, o exemplo executa o agregação pipeline:
const pipeline = [   {      $redact: {       $cond: {           if: { $gte: ["$imdb.rating", 9] },          then: "$$KEEP",          else: "$$PRUNE"         }     }   } ]; const cursor = collection.aggregate(pipeline); return cursor; 
Saiba mais
Para saber mais sobre as variáveis do sistema neste guia, consulte a página Variáveis de agregação.