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.
The
$redactstage has the following prototype form:{ $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$redactexcludes all fields at this current document/embedded document level, without further inspection of any of the excluded fields. This applies even if the excluded field contains embedded documents that may have different access levels.$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" ] } } ] } )
A user has access to view information with either the tag "STLW" or "G". To run a query on all documents with year 2014 for this user, include a $redact stage as in the following:
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.
To run a query on all documents with status A and exclude all fields contained in a document/embedded document at level 5, include a $redact stage that specifies the system variable "$$PRUNE" in the then field:
db.accounts.aggregate( [ { $match: { status: "A" } }, { $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } } ] );
The $redact stage evaluates the level field to determine access. If the level field equals 5, then exclude all fields at that level, even if the excluded field contains embedded documents that may have different level values, such as the shipping_addr field.
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.