code: func (t *Transaction) FindFields(c *Collection, id string, fieldNames []string, model Model) {
  	if err := c.checkModelType(model); err != nil {
  		t.setError(fmt.Errorf("zoom: Error in FindFields or Transaction.FindFields: %s", err.Error()))
  		return
  	}
  	// Set the model id and create a modelRef
  	model.SetModelID(id)
  	mr := &modelRef{
  		collection: c,
  		spec:       c.spec,
  		model:      model,
  	}
  	// Check the given field names and append the corresponding redis field names
  	// to args.
  	args := redis.Args{mr.key()}
  	for _, fieldName := range fieldNames {
  		if !stringSliceContains(c.spec.fieldNames(), fieldName) {
  			t.setError(fmt.Errorf("zoom: Error in FindFields or Transaction.FindFields: Collection %s does not have field named %s", c.Name(), fieldName))
  			return
  		}
  		// args is an array of arguments passed to the HMGET command. We want to
  		// use the redis names corresponding to each field name. The redis names
  		// may be customized via struct tags.
  		args = append(args, c.spec.fieldsByName[fieldName].redisName)
  	}
  	// Check if the model actually exists.
  	t.Command("EXISTS", redis.Args{mr.key()}, newModelExistsHandler(c, id))
  	// Get the fields from the main hash for this model
  	t.Command("HMGET", args, newScanModelRefHandler(fieldNames, mr))
  }
docs: // FindFields is like Find but finds and sets only the specified fields. Any
  // fields of the model which are not in the given fieldNames are not mutated.
  // FindFields will return an error if any of the given fieldNames are not found
  // in the model type.