Definição
$redactRestringe 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 qualquer expressã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$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.$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 se campo incluído contiver 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." } ] }
Dica
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.