code: def test_distinct(self):
      d = fo.Dataset()
      d.add_sample_field(
          "strings", fo.ListField, subfield=fo.StringField()
      )
      s = fo.Sample(filepath="image.jpeg")
      s["string"] = "string"
      s["strings"] = ["one", "two"]
      d.add_sample(s)
      self.assertEqual(d.distinct("string"), ["string"])
      self.assertEqual(d.distinct("strings"), ["one", "two"])
  
      d = fo.Dataset()
      s = fo.Sample(filepath="video.mp4")
  
      s = fo.Sample(filepath="image.jpeg")
      d.add_sample(s)
      s["classification"] = fo.Classification(
          label="label", confidence=1
      )
      s.save()
      self.assertEqual(d.distinct("classification.label"), ["label"])
      s["classifications"] = fo.Classifications(
          classifications=[
              fo.Classification(label="one"),
              fo.Classification(label="two"),
          ]
      )
      s.save()
      self.assertEqual(
          d.distinct("classifications.classifications.label"),
          ["one", "two"],
      )
  
      self.assertEqual(
          d.distinct(
              F("classifications.classifications.label").upper()
          ),
          ["ONE", "TWO"],
      )
  
      d = fo.Dataset()
      s = fo.Sample(filepath="video.mp4")
      s[1]["classification"] = fo.Classification(
          label="label", confidence=1
      )
      d.add_sample(s)
      self.assertEqual(
          d.distinct("frames.classification.label"), ["label"]
      )
  
imports: from datetime import date, datetime, timedelta
  import math
  from bson import ObjectId
  import numpy
  import unittest
  import fiftyone
  import fiftyone.core.fields
  from fiftyone import ViewField
  from decorators import drop_datasets
label_desc: Use image node_id 4 for calling the DatasetTests obj's underlying member method code with example usage: obj.test_distinct() without return types