Metafields are pretty simple, and very useful. First off, you can set them in the Admin. Create one with a description.
Note the concept of my_fields is really dumb, instead, think of it as "context", the "what am I in all this". So you might use a namespace here, like "product_videos". Hence, at this point, think of it as a box named, with whatever is inside the box, still a mystery!
product.metafields.product_videos
Or your company name. Or your cat's name. Or whatever turns your crank. my_fields is just generic filler. Means nothing.
Once you get over that hump, that you've now got a namespace, you can actually get down to the nitty-gritty. Anything of value to you is likely to be a string here, a string representing a video. So you want to make the type of the Metafield to be text. A string of text.
To be of much use, you need a key. You want to grab onto the key! So if a product has a special movie, let the key guide you right to it! The key is going to be something brilliant like; video_id! So now you have a product, with a Metafield resource, in your namespace, product_videos, with a key! Namely video_id. And you can then go to that product in your Shopify Admin, and at the bottom of the details page, fill in the answer to the question of video_id. Give it some info. Where to find the video. What it is called. Anything useful to you.
Now in your theme, just reference {{ product.metafields.product_videos.video_id }} when you need it.
This is now supported and is a game changer! Shopify released a new metafield format type called "json_string" that lets you directly access the value of each node via normal liquid dot notation. I know this will make EVERYONE'S life easier. Taken from the documentation (https://help.shopify.com/en/themes/liquid/objects/metafield):

Here was one of the initial posts from a Shopify developer on the Shopify forums that may help: https://ecommerce.shopify.com/c/api-announcements/t/new-json_string-value-type-for-metafield-object-540896
If you see the key:value emitted from Shopify as {"wingus" => "wongus"} perhaps you can pass that same key:value pair through the Liquid JSON filter and fix that?
{{ product.metafield.ffcc.qwerty.value | json }}
I am also very surprised the Liquid render provides the JSON value without doing that. I wrote a bug report about that some time ago to no effect. But anyway, passing through the filter works and you can immediately use the JSON to no ill-effect.
Worked it out, so leaving this answer for anyone else in the future:
<div class="feed--faqs">
{% if page.metafields.faq != blank %}
{% assign faqs = page.metafields.faq.heading %}
{% for value in faqs %}
{% assign i = forloop.index0 %}
<div class="item item--{{ i }}">
<h4>{{ page.metafields.faq.heading[i] }}</h4>
<p>{{ page.metafields.faq.content[i] }}</p>
</div>
{% endfor %}
{% endif %}
</div>
Metafield value type is set to 'Json String'.
For reference, I'm using the ArenaCommerce Advanceds Custom Fields app: https://apps.shopify.com/advanced-custom-field.
This syntax is wrong .{{product.metafields.global["prod__" & type]}}
You can't concatenate strings that way.
You should generate the string before hand and use the ready string:
{% assign type = product.type | prepend: 'prod_' %}
{{product.metafields.global[type]}}
or
{%- capture type -%}type_{{product.type}}{%- endcapture -%}
{{product.metafields.global[type]}}