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. - $setIntersectiontem a seguinte sintaxe:- { $setIntersection: [ <array1>, <array2>, ... ] } - Os argumentos podem ser qualquerexpressão válida, desde que cada um deles resolva para uma array. Para mais informações sobre expressões, consulte Expressões. 
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.