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
$redactestágio tem o seguinte formato 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 atual/ documento incorporado , 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 visualizar informações com a marcação "STLW" "G"ou. Para executar uma query em todos os documentos com o ano 2014 para esse usuário, inclua um estágio como a $redact 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 5 nível, inclua uma etapa que especifique a variável do $redact sistema "$$PRUNE" no then campo:
db.accounts.aggregate( [ { $match: { status: "A" } }, { $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } } ] );
O estágio avalia $redact o level campo para determinar o acesso. Se o level campo for igual 5 a, exclua todos os campos desse nível, mesmo que o campo excluído contenha documentos incorporados que possam ter level valores diferentes, como o shipping_addr campo.
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 excluiu o $redact campo cc como um todo, incluindo o shipping_addr campo que continha documentos incorporados que tinham level valores de campo iguais a 3 e 5 não.
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.