Re: Metaobjects Graphql query

How to effectively use Metaobjects in Graphql queries for filtering products?

CalebV
Shopify Partner
15 0 4

I'm buiding an app for a client and I am making use of the new metaobjects. I noticed what when I created a search filter for products, I could do a general query and filter out products that way instead of targeting specific fields within the products. With the metaobjects, the best I can do is apply the search query to the display name or updated at and the general search query doesn't return anything. Also, while searching the field, I have to have exact matches and not a part of a word, so in order for the filter to work, you must type at least one entire word that is a part of the display name. Am I doing anything wrong here? I even played around with the shopify graphiql app and couldn't get any partials or general queries to return results. Once again, I am able to do this with products, is it because metaobjects are new? Trying to figure this out.

Replies 2 (2)

oscprofessional
Shopify Partner
15938 2383 3092

Hello @CalebV 

When working with metafields and metaobjects in Shopify, the behavior you described is expected. The search functionality for metafields is more limited compared to searching for specific fields within the products.

By default, the search functionality for metafields is limited to the display name and the updated timestamp. This means that if you want to perform a search on metafields, you need to target the display name or updated at fields specifically.

Partial word matches or general queries across all metafields are not supported out of the box. The search queries for metafields generally require exact matches or matching specific fields.

This behavior is not specific to the fact that metaobjects are new. It is designed this way to provide a more controlled and specific search experience for metafields. The search capabilities for metafields are more limited compared to the broader search functionality available for other fields within the Shopify API.

If you require more flexible search capabilities or the ability to perform partial word matches across metafields, you may need to implement your own custom search logic within your app. This could involve retrieving the metafield values and performing additional filtering or searching on your end, outside of the standard Shopify API functionality.

Alternatively, you can explore third-party search solutions or extensions that provide advanced search capabilities for metafields in Shopify.

Remember to consult the Shopify documentation and API reference for the latest updates and guidelines on working with metafields and metaobjects.
Thanks

Get pass your Store Core Web Vital Free Speed Optimization Audit, Chat on WhatsApp | Skype : oscprofessionals-87 | Email: pallavi@oscprofessionals.com | Hire us | Guaranteed Site Speed Optimization | Website Free Audit | Shopify Theme Customization | Build Shopify Private App | Shopify SEO | Digital Marketing | Oscp Upsell & Cross sell App : Free | Oscp Sales & Volume Discount App : Free | Custom Pricing Wholesale App : Free
sweeperq
Shopify Partner
1 0 0

We are encountering this as well. Metaobjects show a lot of promise, but if you can only filter on `display_name` and `updated_at`, and only sort on `id`, `type`, `display_name` and `updated_at`, it makes it somewhat difficult to do meaningful things with them.  In order to do any sorting or filtering, you have to spend a bunch of your API lookups to download the entire set, then filter in memory. That is the opposite of what GraphQL is supposed to be for. Some folks' datasets may be large enough to exhaust their API calls. So then, your app has to do a bulk query operation and make the user wait for a response to actually view things.

 

I really hope Shopify changes this and allows folks to mark metaobject fields as queryable and/or sortable.

For instance, we created a Photo metaobject definition with:

  • Image file
  • Title
  • Description
  • Published Date
  • Published (boolean)

Ideally we would be able to do something like (Note: I don't know that the filter and sort syntax is right):

{
metaobjects(type: "photo", first: 10, query:"fields.published.value:true", sortKey:"fields.published_on.value") {
edges {
node {
id
handle
fields {
key
value
}
}
}
}
}

Then we are only getting 10 of exactly what we need instead of returning every metaobject in the system and filtering after the fact.