Mongo Query to fetch distinct nested documents

You can use $projectfirst to get rid of tsh field and then run $setUnion which ignores duplicated entries:

db.collection.aggregate([
    {
        $project: {
            "HList.tsh": 0,
            "PList.tsh": 0,
            "CList.tsh": 0,
        }
    },
    {
        $project: {
            products: {
                $setUnion: [ "$HList", "$PList", "$CList" ]
            }
        }
    }
])

Mongo Playground


The following two aggregations return the expected and same result (you can use any of the two):

db.collection.aggregate( [
  { 
      $project: { 
          _id: 0, 
          products: {
              $reduce: {
                  input: { $setUnion: [ "$HList", "$PList", "$CList" ] }, 
                  initialValue: [],
                  in: {
                      $setUnion: [ "$$value", [ { productId: "$$this.productId", name: "$$this.name" } ] ]
                  }
              } 
          } 
      } 
  }
] )

This one is little verbose:

db.collection.aggregate( [
  { 
      $project: { list: { $setUnion: [ "$HList", "$PList", "$CList" ] } } 
  },
 { 
      $unwind: "$list" 
  },
  { 
      $group: { 
          _id: null, 
          products: { $addToSet: { "productId": "$list.productId", "name": "$list.name" } } 
      } 
  },
  { 
      $project: { _id: 0 } 
  }
] )