@@ -54,14 +54,9 @@ Definition
5454
5555        - Adds a new field or resets the value of an existing field.
5656
57-           .. versionchanged:: 3.6
57+           If the the expression evaluates to ``$$REMOVE``, the field is
58+           excluded in the output. For details, see :ref:`remove-var`.
5859
59-              MongoDB 3.6 adds the variable :variable:`REMOVE`. If the
60-              the expression evaluates to ``$$REMOVE``, the field is
61-              excluded in the output. For details, see :ref:`remove-var`.
62- 
63- 
64-          
6560      * - ``<field>:<0 or false>``
6661
6762        - Specifies the exclusion of a field.
@@ -103,8 +98,6 @@ must explicitly specify the suppression of the ``_id`` field in
10398Exclude Fields
10499~~~~~~~~~~~~~~
105100
106- .. versionadded:: 3.4
107- 
108101If you specify the exclusion of a field or fields, all other fields are
109102returned in the output documents.
110103
@@ -126,11 +119,9 @@ See also the :pipeline:`$unset` stage to exclude fields.
126119Exclude Fields Conditionally
127120````````````````````````````
128121
129- .. versionadded:: 3.6
130- 
131- Starting in MongoDB 3.6, you can use the variable :variable:`REMOVE` in
132- aggregation expressions to conditionally suppress a field. For an
133- example, see :ref:`remove-example`.
122+ You can use the variable :variable:`REMOVE` in aggregation expressions
123+ to conditionally suppress a field. For an example, see
124+ :ref:`remove-example`.
134125
135126Add New Fields or Reset Existing Fields
136127~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -162,12 +153,13 @@ existing field, you can effectively rename a field.
162153New Array Fields
163154````````````````
164155
165- Starting in MongoDB 3.2,  :pipeline:`$project` stage supports using the
166- square brackets ``[]``  to directly create new array fields. If array
167- specification includes fields that are non-existent  in a document, the
168- operation substitutes ``null`` as the value  for that field. For an
169- example, see  :ref:`example-project-new-array-fields`.
156+ The  :pipeline:`$project` stage supports using the square brackets ``[]`` 
157+ to directly create new array fields. If you specify  array fields that do 
158+ not exist  in a document, the operation substitutes ``null`` as the value 
159+ for that field. For an example, see 
160+ :ref:`example-project-new-array-fields`.
170161
162+ .. include:: /includes/project-stage-and-array-index.rst
171163
172164Embedded Document Fields
173165~~~~~~~~~~~~~~~~~~~~~~~~
@@ -216,10 +208,10 @@ fails with the same error:
216208Restrictions
217209~~~~~~~~~~~~
218210
219- .. versionchanged:: 3.4
211+ An error is returned if the :pipeline:`$project` specification is
212+ an empty document.
220213
221- MongoDB 3.4 and later produces an error if the :pipeline:`$project`
222- specification is an empty document.
214+ .. include:: /includes/project-stage-and-array-index.rst
223215
224216Examples
225217--------
@@ -289,9 +281,6 @@ The operation results in the following document:
289281Exclude Fields from Output Documents
290282~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
291283
292- 
293- .. versionadded:: 3.4
294- 
295284Consider a ``books`` collection with the following document:
296285
297286.. code-block:: javascript
@@ -317,8 +306,6 @@ See also the :pipeline:`$unset` stage to exclude fields.
317306Exclude Fields from Embedded Documents
318307~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
319308
320- .. versionadded:: 3.4
321- 
322309Consider a ``books`` collection with the following document:
323310
324311.. code-block:: javascript
@@ -366,10 +353,8 @@ See also the :pipeline:`$unset` stage to exclude fields.
366353Conditionally Exclude Fields
367354~~~~~~~~~~~~~~~~~~~~~~~~~~~~
368355
369- .. versionadded:: 3.6
370- 
371- Starting in MongoDB 3.6, you can use the variable :variable:`REMOVE` in
372- aggregation expressions to conditionally suppress a field.
356+ You can use the variable :variable:`REMOVE` in aggregation expressions
357+ to conditionally suppress a field.
373358
374359Consider a ``books`` collection with the following document:
375360
@@ -560,6 +545,53 @@ The operation returns the following document:
560545
561546   { "_id" : ObjectId("55ad167f320c6be244eb3b95"), "myArray" : [ 1, 1, null ] }
562547
548+ .. _example-project-array-indexes:
549+ 
550+ Array Indexes are Unsupported
551+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
552+ 
553+ You cannot use an array index with the :pipeline:`$project` stage. This
554+ section shows an example.
555+ 
556+ Create the following ``pizzas`` collection:
557+ 
558+ .. code-block:: javascript
559+ 
560+    db.pizzas.insert( [
561+       { _id: 0, name: [ 'Pepperoni' ] },
562+    ] )
563+ 
564+ The following example returns the pizza:
565+ 
566+ .. code-block:: javascript
567+ 
568+    db.pizzas.aggregate( [
569+       { $project: { x: '$name', _id: 0 } },
570+    ] )
571+ 
572+ The pizza is returned in the example output:
573+ 
574+ .. code-block:: javascript
575+    :copyable: false
576+ 
577+    [ { x: [ 'Pepperoni' ] } ]
578+ 
579+ The following example uses an array index (``$name.0``) to attempt to
580+ return the pizza:
581+ 
582+ .. code-block:: javascript
583+ 
584+    db.pizzas.aggregate( [
585+       { $project: { x: '$name.0', _id: 0 } },
586+    ] )
587+ 
588+ The pizza is not returned in the example output:
589+ 
590+ .. code-block:: javascript
591+    :copyable: false
592+ 
593+    [ { x: [] } ]
594+ 
563595.. seealso::
564596
565597   - :doc:`/tutorial/aggregation-zip-code-data-set`
0 commit comments