def list_schema(self, field_or_expr, expr=None):
        """Extracts the value type(s) in a specified list field across all
        samples in the collection.

        Examples::

            from datetime import datetime
            import fiftyone as fo

            dataset = fo.Dataset()

            sample1 = fo.Sample(
                filepath="image1.png",
                ground_truth=fo.Classification(
                    label="cat",
                    info=[
                        fo.DynamicEmbeddedDocument(
                            task="initial_annotation",
                            author="Alice",
                            timestamp=datetime(1970, 1, 1),
                            notes=["foo", "bar"],
                        ),
                        fo.DynamicEmbeddedDocument(
                            task="editing_pass",
                            author="Bob",
                            timestamp=datetime.utcnow(),
                        ),
                    ],
                ),
            )

            sample2 = fo.Sample(
                filepath="image2.png",
                ground_truth=fo.Classification(
                    label="dog",
                    info=[
                        fo.DynamicEmbeddedDocument(
                            task="initial_annotation",
                            author="Bob",
                            timestamp=datetime(2018, 10, 18),
                            notes=["spam", "eggs"],
                        ),
                    ],
                ),
            )

            dataset.add_samples([sample1, sample2])

            # Determine that `ground_truth.info` contains embedded documents
            print(dataset.list_schema("ground_truth.info"))
            # fo.EmbeddedDocumentField

            # Determine the fields of the embedded documents in the list
            print(dataset.schema("ground_truth.info[]"))
            # {'task': StringField, ..., 'notes': ListField}

            # Determine the type of the values in the nested `notes` list field
            # Since `ground_truth.info` is not yet declared on the dataset's
            # schema, we must manually include `[]` to unwind the info lists
            print(dataset.list_schema("ground_truth.info[].notes"))
            # fo.StringField

            # Declare the `ground_truth.info` field
            dataset.add_sample_field(
                "ground_truth.info",
                fo.ListField,
                subfield=fo.EmbeddedDocumentField,
                embedded_doc_type=fo.DynamicEmbeddedDocument,
            )

            # Now we can inspect the nested `notes` field without unwinding
            print(dataset.list_schema("ground_truth.info.notes"))
            # fo.StringField

        Args:
            field_or_expr: a field name, ``embedded.field.name``,
                :class:`fiftyone.core.expressions.ViewExpression`, or
                `MongoDB expression <https://docs.mongodb.com/manual/meta/aggregation-quick-reference/#aggregation-expressions>`_
                defining the field or expression to aggregate
            expr (None): a :class:`fiftyone.core.expressions.ViewExpression` or
                `MongoDB expression <https://docs.mongodb.com/manual/meta/aggregation-quick-reference/#aggregation-expressions>`_
                to apply to ``field_or_expr`` (which must be a field) before
                aggregating

        Returns:
            a :class:`fiftyone.core.fields.Field` or list of
            :class:`fiftyone.core.fields.Field` instances describing the value
            type(s) in the list
        """
        make = lambda field_or_expr: foa.ListSchema(field_or_expr, expr=expr)
        return self._make_and_aggregate(make, field_or_expr)
Extracts the value type(s) in a specified list field across all
        samples in the collection.

        Examples::

            from datetime import datetime
            import fiftyone as fo

            dataset = fo.Dataset()

            sample1 = fo.Sample(
                filepath="image1.png",
                ground_truth=fo.Classification(
                    label="cat",
                    info=[
                        fo.DynamicEmbeddedDocument(
                            task="initial_annotation",
                            author="Alice",
                            timestamp=datetime(1970, 1, 1),
                            notes=["foo", "bar"],
                        ),
                        fo.DynamicEmbeddedDocument(
                            task="editing_pass",
                            author="Bob",
                            timestamp=datetime.utcnow(),
                        ),
                    ],
                ),
            )

            sample2 = fo.Sample(
                filepath="image2.png",
                ground_truth=fo.Classification(
                    label="dog",
                    info=[
                        fo.DynamicEmbeddedDocument(
                            task="initial_annotation",
                            author="Bob",
                            timestamp=datetime(2018, 10, 18),
                            notes=["spam", "eggs"],
                        ),
                    ],
                ),
            )

            dataset.add_samples([sample1, sample2])

            # Determine that `ground_truth.info` contains embedded documents
            print(dataset.list_schema("ground_truth.info"))
            # fo.EmbeddedDocumentField

            # Determine the fields of the embedded documents in the list
            print(dataset.schema("ground_truth.info[]"))
            # {'task': StringField, ..., 'notes': ListField}

            # Determine the type of the values in the nested `notes` list field
            # Since `ground_truth.info` is not yet declared on the dataset's
            # schema, we must manually include `[]` to unwind the info lists
            print(dataset.list_schema("ground_truth.info[].notes"))
            # fo.StringField

            # Declare the `ground_truth.info` field
            dataset.add_sample_field(
                "ground_truth.info",
                fo.ListField,
                subfield=fo.EmbeddedDocumentField,
                embedded_doc_type=fo.DynamicEmbeddedDocument,
            )

            # Now we can inspect the nested `notes` field without unwinding
            print(dataset.list_schema("ground_truth.info.notes"))
            # fo.StringField

        Args:
            field_or_expr: a field name, ``embedded.field.name``,
                :class:`fiftyone.core.expressions.ViewExpression`, or
                `MongoDB expression <https://docs.mongodb.com/manual/meta/aggregation-quick-reference/#aggregation-expressions>`_
                defining the field or expression to aggregate
            expr (None): a :class:`fiftyone.core.expressions.ViewExpression` or
                `MongoDB expression <https://docs.mongodb.com/manual/meta/aggregation-quick-reference/#aggregation-expressions>`_
                to apply to ``field_or_expr`` (which must be a field) before
                aggregating

        Returns:
            a :class:`fiftyone.core.fields.Field` or list of
            :class:`fiftyone.core.fields.Field` instances describing the value
            type(s) in the list
        
fiftyone/core/collections.py