Join live – Get insights, tips, + Q&A from Sanity developers on our latest releases

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.
type fields that have an
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:
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'
            return true
Sep 21, 2020, 9:45 AM
Thanks for sharing the outcome! 🙌
Sep 21, 2020, 9:46 AM

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.

Was this answer helpful?

Categorized in