What is the best way to validate that e.g. a title for a document is unique within its type?

5 replies
Last updated: Sep 21, 2020

Hi,What is the best way to validate that e.g. a title for a document is unique within its type?
Is it to make a custom inputComponent for the fields and make a client groq check before updating the value, or is there a smarter, simpler way?

Sep 21, 2020, 8:46 AM

Hi Louise, I think there’s no easy function available for this, unfortunately (unlike e.g.

slug
type fields that have an
isUnique()
option). However, I don’t think you’d have to create a custom input component to achieve it. Instead, you could use an async operation to check inside the validation function itself: https://www.sanity.io/docs/validation#custom-validation-091e10f957aa

Sep 21, 2020, 9:19 AM

Ok thanks

user M
- I have been looking at the examples previously. How do I validate against other documents though? I do not think they are available in the context parameter. Should I have a reference to a client and do a groq lookup?

Sep 21, 2020, 9:24 AM

Indeed, I would import the pre-configured client and check for existing docs with the title:

import client from 'part:@sanity/base/client'
. There might be an alternative way but it’s Monday and I can’t come up with it if so 😉 Will update if I think of something but in my mind this approach is the most straightforward.

Sep 21, 2020, 9:32 AM

Ok great, thanks.An example for others that might find this thread:

import client from 'part:@sanity/base/client'
...
{
      name: 'title',
      title: 'Title',
      type: 'string',
      validation: Rule => Rule.required().custom((title) => {
        return client.fetch(`count(*[_type == "category" && title == "${title}"])`)
        .then(count => {
          if (count > 1){
            return 'Title needs to be unique'
          }else{
            return true
          }
        })
      })
    },

Sep 21, 2020, 9:45 AM

Thanks for sharing the outcome! 🙌

Sep 21, 2020, 9:46 AM

Sanity.io: Get the most out of your content

Sanity.io is a platform to build websites and applications. It comes with great APIs that let you treat content like data. Give your team exactly what they need to edit and publish their content with the customizable Sanity Studio. Get real-time collaboration out of the box. Sanity.io comes with a hosted datastore for JSON documents, query languages like GROQ and GraphQL, CDNs, on-demand asset transformations, presentation agnostic rich text, plugins, and much more.

Don't compromise on developer experience. Join thousands of developers and trusted companies and power your content with Sanity.io. Free to get started, pay-as-you-go on all plans.