Querying for products that have a variant referencing a specific attribute in a Shopify + Sanity schema.
9 replies
Last updated: Jul 15, 2022
P
Hello 👋 . I'm using the sanity + shopify reference schema from here . At least close enough to it w.r.t. the objects and references for "sanity" products and variants vs. objects for the shopify products and variants. I've added an array of references to
productVariantthat point to some other new document type. I want to use the
references()function to find all `product`s that have a variant that reference a particular document of that type. I cannot figure out how to drill down in GROQ from a
*[_type == 'product']thru the
shopifyProductobject which references a
productVariantwhich ultimately has the reference to the document I'm considering. Thanks for any help.
Jul 13, 2022, 9:26 PM
P
*[_type == 'product' && _id == 'shopifyProduct-7429472551073']{ _id, "title": shop.title, "attributes": *[_type == 'attribute_color'], "attributes_real": attributes }
Jul 13, 2022, 9:27 PM
P
returns
but I'm getting all
"result":[1 item 0:{4 items "_id":"shopifyProduct-7429472551073" "attributes":[2 items 0:{8 items "_createdAt":"2022-07-11T15:15:33Z" "_id":"44feb843-664a-4800-847a-f48ff1deee15" "_rev":"gw7R8VGfQihCUGoM3ImJHF" "_type":"attribute_color" "_updatedAt":"2022-07-13T20:32:37Z" "key":"apparel_color" "name":"Apparel Color" "tag":"apparel" } 1:{7 items "_createdAt":"2022-07-08T13:48:12Z" "_id":"8319f6ae-7fbb-4a96-b6a6-08fc0863ed4e" "_rev":"o1F9UMohcy1KTaXxhtJRJQ" "_type":"attribute_color" "_updatedAt":"2022-07-08T13:48:12Z" "key":"lure_color" "name":"Lure Color" } ] "attributes_real":[1 item 0:{3 items "_key":"c827a7fbbd22" "_type":"attributedvalue_color" "attribute":{2 items "_ref":"44feb843-664a-4800-847a-f48ff1deee15" "_type":"reference" } } ] "title":NULL } ]
attribute_colorin attributes. I just want the
apparel_colorhere. Ultimately I want to remove the top level id filter and get all the documents that have a variant that reference
apparel_colorattribute. Or generally any other attribute we've defined.
Jul 13, 2022, 9:30 PM
Hi Phil! 👋 I’m hoping you can help me clarify if this is the core of your question: “I want to … find all `product`s that have a variant that reference a particular document of that type.”
Jul 14, 2022, 4:04 PM
P
Hi Geoff. I'm starting from this example in the GROQ cheat sheet
However my
movie (product) does not reference a person (attribute) directly. I'm my schema, product owns an object shopifyProduct that has an array of references to productVariant which has an array of references to attribute. I want to find all the product documents that, thru this round about model, ultimately have a productVariant which has a reference to a particular attribute in its array of attribute references.
// Movies which reference ancient people *[_type=="movie" && references(*[_type=="person" && age > 99]._id)]{title}
movie (product) does not reference a person (attribute) directly. I'm my schema, product owns an object shopifyProduct that has an array of references to productVariant which has an array of references to attribute. I want to find all the product documents that, thru this round about model, ultimately have a productVariant which has a reference to a particular attribute in its array of attribute references.
Jul 14, 2022, 8:22 PM
Great, thank you. When you say “_product_ owns an object shopifyProduct,” can I confirm that means
shopifyProductis an object in the schema (it’s just not showing because it wasn’t included in the projection)?
Jul 14, 2022, 8:29 PM
P
yes, its defined as an object in the schema. Full disclosure, we started from your reference schema for the Sanity connect app w/ Shopify. Then added a new document type, attribute. The productVariant document has an array of references to type of attribute.
Jul 14, 2022, 8:31 PM
Perfect, thank you. I’m not sure if this’ll work first try, as there are places where we might have structured things differently, but if you want to get a
productwith an array of references that has an array of references containing a title of ‘Apparel Color’, it might look something like this (bear in mind that arrays need names too, so I used
myArray):
*[_type == 'product' && 'Apparel Color' in shopifyProduct.myArray[]->myArray[]->title]
Jul 15, 2022, 12:12 AM
P
🔥 🙏 I didn't think to kind of invert the lookup. Many thanks. This was the working query BTW:
*[_type == 'product' && 'apparel_color' in store.variants[]->attributes[].attribute->key]
Jul 15, 2022, 12:20 PM
Sanity– build remarkable experiences at scale
Sanity is a modern headless CMS that treats content as data to power your digital business. Free to get started, and pay-as-you-go on all plans.