$setIntersection (agregação)
Nesta página
Definição
$setIntersection
Obtém dois ou mais arrays e retorna uma array que contém os elementos que aparecem em cada array de entrada.
$setIntersection
tem a seguinte sintaxe:{ $setIntersection: [ <array1>, <array2>, ... ] } Os argumentos podem ser qualquerexpressão válida, desde que cada um deles resolva para uma array. Para obter mais informações sobre expressões, consulte Operadores de expressão.
Comportamento
$setIntersection
executa operação de conjunto em arrays, tratando arrays como conjuntos. Se uma array contiver entradas duplicadas, $setIntersection
ignora essas entradas. $setIntersection
ignora a ordem dos elementos.
$setIntersection
filtra duplicatas em seu resultado para gerar uma matriz que contém apenas entradas únicas. A ordem dos elementos na matriz de saída não é especificada.
Se nenhuma interseção for encontrada (ou seja, as arrays de entrada não contêm elementos comuns), $setIntersection
retornará uma array vazia.
Se um conjunto contiver um elemento de array aninhada, $setIntersection
não desce para a array aninhada, mas avalia a array no nível superior.
Exemplo | Resultado | ||
---|---|---|---|
|
| ||
|
|
Exemplos
Esta seção contém exemplos que mostram o uso do $setIntersection
com collections.
Exemplo de array de elementos
Considere uma coleção flowers
com os seguintes documentos:
db.flowers.insertMany( [ { "_id" : 1, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid" ] }, { "_id" : 2, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "orchid", "rose", "orchid" ] }, { "_id" : 3, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid", "jasmine" ] }, { "_id" : 4, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "jasmine", "rose" ] }, { "_id" : 5, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ ] }, { "_id" : 6, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose" ], [ "orchid" ] ] }, { "_id" : 7, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose", "orchid" ] ] }, { "_id" : 8, "flowerFieldA" : [ ], "flowerFieldB" : [ ] }, { "_id" : 9, "flowerFieldA" : [ ], "flowerFieldB" : [ "rose" ] } ] )
A operação a seguir usa o operador $setIntersection
para gerar uma array de elementos comuns à array flowerFieldA
e à array flowerFieldB
:
db.flowers.aggregate( [ { $project: { flowerFieldA: 1, flowerFieldB: 1, commonToBoth: { $setIntersection: [ "$flowerFieldA", "$flowerFieldB" ] }, _id: 0 } } ] )
A operação retorna os seguintes resultados:
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid" ], "commonToBoth" : [ "orchid", "rose" ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "orchid", "rose", "orchid" ], "commonToBoth" : [ "orchid", "rose" ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid", "jasmine" ], "commonToBoth" : [ "orchid", "rose" ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "jasmine", "rose" ], "commonToBoth" : [ "rose" ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ ], "commonToBoth" : [ ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose" ], [ "orchid" ] ], "commonToBoth" : [ ] } { "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose", "orchid" ] ], "commonToBoth" : [ ] } { "flowerFieldA" : [ ], "flowerFieldB" : [ ], "commonToBoth" : [ ] } { "flowerFieldA" : [ ], "flowerFieldB" : [ "rose" ], "commonToBoth" : [ ] }
Recuperar Documentos para Funções Concedidas ao Usuário Atual
A partir do MongoDB 7.0, você pode usar a nova variável de sistemaUSER_ROLES
para retornar funções de usuário .
O cenário nesta section mostra users com várias roles que têm acesso limitado a documents em uma coleção que contém information sobre budget.
O cenário mostra um possível uso de USER_ROLES
. A coleção budget
contém documentos com um campo denominado allowedRoles
. Como você verá no cenário a seguir, você pode escrever queries que comparam as funções de usuário encontradas no campo allowedRoles
com as funções retornadas pela variável de sistema USER_ROLES
.
Observação
Para outro cenário de exemplo USER_ROLES
, consulte Recuperar informações médicas para funções concedidas ao usuário atual. Esse exemplo não armazena as funções de usuário nos campos do documento, como é feito no exemplo a seguir.
Para o cenário de orçamento nesta seção, execute as seguintes etapas para criar as roles, os usuários e a collection budget
:
Criar os usuários
Crie usuários nomeados John
e Jane
com os papéis exigidos. Substitua o banco de dados test
pelo nome do banco de dados.
db.createUser( { user: "John", pwd: "jn008", roles: [ { role: "Marketing", db: "test" }, { role: "Development", db: "test" }, { role: "Operations", db: "test" }, { role: "read", db: "test" } ] } ) db.createUser( { user: "Jane", pwd: "je009", roles: [ { role: "Sales", db: "test" }, { role: "Operations", db: "test" }, { role: "read", db: "test" } ] } )
Criar a coleção
Executar:
db.budget.insertMany( [ { _id: 0, allowedRoles: [ "Marketing" ], comment: "For marketing team", yearlyBudget: 15000 }, { _id: 1, allowedRoles: [ "Sales" ], comment: "For sales team", yearlyBudget: 17000, salesEventsBudget: 1000 }, { _id: 2, allowedRoles: [ "Operations" ], comment: "For operations team", yearlyBudget: 19000, cloudBudget: 12000 }, { _id: 3, allowedRoles: [ "Development" ], comment: "For development team", yearlyBudget: 27000 } ] )
Execute as seguintes etapas para recuperar os documentos acessíveis a John
:
Recuperar os documentos
Para usar uma variável do sistema, adicione $$
ao início do nome da variável. Especifique a variável de sistema USER_ROLES
como $$USER_ROLES
.
Executar:
db.budget.aggregate( [ { $match: { $expr: { $not: { $eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ] } } } } ] )
O exemplo anterior retorna os documentos da coleção budget
que correspondem a pelo menos uma das funções que o usuário que executa o exemplo tem. Para fazer isso, o exemplo usa $setIntersection
para retornar documentos em que a interseção entre o campo budget
document allowedRoles
e o conjunto de funções do usuário de $$USER_ROLES
não está vazia.
Examine os documentos
John
tem as funções Marketing
, Operations
e Development
e vê estes documentos:
[ { _id: 0, allowedRoles: [ 'Marketing' ], comment: 'For marketing team', yearlyBudget: 15000 }, { _id: 2, allowedRoles: [ 'Operations' ], comment: 'For operations team', yearlyBudget: 19000, cloudBudget: 12000 }, { _id: 3, allowedRoles: [ 'Development' ], comment: 'For development team', yearlyBudget: 27000 } ]
Execute as seguintes etapas para recuperar os documentos acessíveis a Jane
:
Recuperar os documentos
Para usar uma variável do sistema, adicione $$
ao início do nome da variável. Especifique a variável de sistema USER_ROLES
como $$USER_ROLES
.
Executar:
db.budget.aggregate( [ { $match: { $expr: { $not: { $eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ] } } } } ] )
Examine os documentos
Jane
tem as funções Sales
e Operations
e vê estes documentos:
[ { _id: 1, allowedRoles: [ 'Sales' ], comment: 'For sales team', yearlyBudget: 17000, salesEventsBudget: 1000 }, { _id: 2, allowedRoles: [ 'Operations' ], comment: 'For operations team', yearlyBudget: 19000, cloudBudget: 12000 } ]
Observação
Em um cluster fragmentado, uma query pode ser executada em um fragmento por outro nó de servidor em nome do usuário. Nestas queries, o USER_ROLES
ainda é preenchido com as funções do usuário.