Skip to content

Commit 476e78f

Browse files
jason-price-mongodbjason-price-mongodb
andauthored
DOCSP-28090 user-roles-in-aggregations (#3235)
* DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations * DOCSP-28090-user-roles-in-aggregations --------- Co-authored-by: jason-price-mongodb <[email protected]>
1 parent c180d50 commit 476e78f

16 files changed

+461
-7
lines changed

source/core/views/create-view.txt

Lines changed: 127 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,11 @@ Some operations are not available with views:
7676

7777
For more information, see :ref:`views-supported-operations`.
7878

79-
Example
80-
-------
79+
Examples
80+
--------
8181

82-
This example populates a collection with student data and creates a view
83-
to query the data.
82+
The first example populates a collection with student data and creates a
83+
view to query the data.
8484

8585
Populate the Collection
8686
~~~~~~~~~~~~~~~~~~~~~~~
@@ -202,6 +202,129 @@ lowercase letters.
202202
{ sID: 17301, name: 'harley', year: 6, score: 3.1 }
203203
]
204204

205+
.. _create-view-user-roles-system-variable-example:
206+
207+
Retrieve Documents for Roles Granted to the Current User
208+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
209+
210+
.. include:: /includes/user-roles-system-variable-introduction.rst
211+
212+
Perform the following steps to create a view and retrieve the documents
213+
accessible to ``John``:
214+
215+
.. procedure::
216+
:style: normal
217+
218+
.. step:: Create the view
219+
220+
.. include:: /includes/user-roles-system-variable-example-description-start.rst
221+
222+
Run:
223+
224+
.. code-block:: javascript
225+
:emphasize-lines: 7
226+
227+
db.createView(
228+
"budgetView", "budget",
229+
[ {
230+
$match: {
231+
$expr: {
232+
$not: {
233+
$eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ]
234+
}
235+
}
236+
}
237+
} ]
238+
)
239+
240+
If you cannot create the view, ensure you log in as a user with
241+
the privilege to create a view.
242+
243+
.. include:: /includes/user-roles-system-variable-example-description.rst
244+
245+
.. step:: Log in as John
246+
247+
.. include:: /includes/user-roles-system-variable-example-login-john.rst
248+
249+
.. step:: Retrieve the documents
250+
251+
Run:
252+
253+
.. code-block:: javascript
254+
255+
db.budgetView.find()
256+
257+
.. step:: Examine the documents
258+
259+
.. include:: /includes/user-roles-system-variable-example-output-john.rst
260+
261+
Perform the following steps to retrieve the documents accessible to
262+
Jane:
263+
264+
.. procedure::
265+
:style: normal
266+
267+
.. step:: Log in as ``Jane``
268+
269+
.. include:: /includes/user-roles-system-variable-example-login-jane.rst
270+
271+
.. step:: Retrieve the documents
272+
273+
Run:
274+
275+
.. code-block:: javascript
276+
277+
db.budgetView.find()
278+
279+
.. step:: Examine the documents
280+
281+
.. include:: /includes/user-roles-system-variable-example-output-jane.rst
282+
283+
Roles with the Same Name in Multiple Databases
284+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
285+
286+
Multiple databases can have roles with the same name. If you create a
287+
view and reference a specific role in the view, you should either
288+
specify both the ``db`` database name field and the ``role`` field, or
289+
specify the ``_id`` field that contains the database name and the role.
290+
291+
The following example returns the roles assigned to ``Jane``, who has
292+
roles with different names. The example returns the ``_id``, ``role``,
293+
and ``db`` database name:
294+
295+
.. procedure::
296+
:style: normal
297+
298+
.. step:: Log in as ``Jane``
299+
300+
.. include:: /includes/user-roles-system-variable-example-login-jane.rst
301+
302+
.. step:: Retrieve the documents
303+
304+
Run:
305+
306+
.. code-block:: javascript
307+
308+
db.budget.findOne( {}, { myRoles: "$$USER_ROLES" } )
309+
310+
.. step:: Examine the documents
311+
312+
Example output, which shows the ``_id``, ``role``, and ``db``
313+
database name in the ``myRoles`` array:
314+
315+
.. code-block:: javascript
316+
:copyable: false
317+
:emphasize-lines: 3-6
318+
319+
{
320+
_id: 0,
321+
myRoles: [
322+
{ _id: 'test.Operations', role: 'Operations', db: 'test' },
323+
{ _id: 'test.Sales', role: 'Sales', db: 'test' },
324+
{ _id: 'test.read', role: 'read', db: 'test' }
325+
]
326+
}
327+
205328
Behavior
206329
--------
207330

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
To use a system variable, add ``$$`` to the start of the variable name.
2+
The ``USER_ROLES`` system variable is specified as ``$$USER_ROLES`` as
3+
shown in the following example.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
The previous example returns the documents from the ``budget``
2+
collection that match at least one of the roles that the user who runs
3+
the example has. To do that, the example uses
4+
:expression:`$setIntersection` to return documents where the
5+
intersection between the ``budget`` document ``allowedRoles`` field and
6+
the set of user roles from ``$$USER_ROLES`` is not empty.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
Run:
2+
3+
.. code-block:: javascript
4+
:emphasize-lines: 4
5+
6+
db.budget.find( {
7+
$expr: {
8+
$not: {
9+
$eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ]
10+
}
11+
}
12+
} )
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Run:
2+
3+
.. code-block:: javascript
4+
5+
db.auth( "Jane", "je009" )
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Run:
2+
3+
.. code-block:: javascript
4+
5+
db.auth( "John", "jn008" )
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
``Jane`` has the ``Sales`` and ``Operations`` roles, and sees these
2+
documents:
3+
4+
.. code-block:: javascript
5+
:copyable: false
6+
7+
[
8+
{
9+
_id: 1,
10+
allowedRoles: [ 'Sales' ],
11+
comment: 'For sales team',
12+
yearlyBudget: 17000,
13+
salesEventsBudget: 1000
14+
},
15+
{
16+
_id: 2,
17+
allowedRoles: [ 'Operations' ],
18+
comment: 'For operations team',
19+
yearlyBudget: 19000,
20+
cloudBudget: 12000
21+
}
22+
]
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
``John`` has the ``Marketing``, ``Operations``, and ``Development``
2+
roles, and sees these documents:
3+
4+
.. code-block:: javascript
5+
:copyable: false
6+
7+
[
8+
{
9+
_id: 0,
10+
allowedRoles: [ 'Marketing' ],
11+
comment: 'For marketing team',
12+
yearlyBudget: 15000
13+
},
14+
{
15+
_id: 2,
16+
allowedRoles: [ 'Operations' ],
17+
comment: 'For operations team',
18+
yearlyBudget: 19000,
19+
cloudBudget: 12000
20+
},
21+
{
22+
_id: 3,
23+
allowedRoles: [ 'Development' ],
24+
comment: 'For development team',
25+
yearlyBudget: 27000
26+
}
27+
]
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
Run:
2+
3+
.. code-block:: javascript
4+
:emphasize-lines: 5
5+
6+
db.budget.aggregate( [ {
7+
$match: {
8+
$expr: {
9+
$not: {
10+
$eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ]
11+
}
12+
}
13+
}
14+
} ] )
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
For examples that include ``USER_ROLES``, see the :ref:`find example
2+
<find-user-roles-system-variable-example>`, :ref:`aggregation example
3+
<setIntersection-user-roles-system-variable-example>`, and the
4+
:ref:`view example <create-view-user-roles-system-variable-example>`.

0 commit comments

Comments
 (0)