How do I make a patch request to a document to change its type? This is resulting in an error Cannot modify immutable attribut

11 replies
Last updated: Sep 11, 2020

How do I make a patch request to a document to change its type? This is resulting in an error

Cannot modify immutable attribute \\"_type\\""

{
  "mutations": [
    {
      "patch": {
        "id": "drafts.<document id>",
        "ifRevisionID": "<revision id>",
        "set": {
          "_type": "slidingBanner"
        },
        "unset": [
          "height"
        ]
      }
    }
  ]
}

Sep 10, 2020, 7:54 PM

Note that in this case, this is a top level document which is referenced all over the place. I also am attempting to do this modification to nested objects embedded in other documents.

Sep 10, 2020, 7:55 PM

I am doing a data migration, so this restriction is quite annoying. I can understand that

_type
should not be able to have any other operation other than
set
applied to it, but also preventing
set
? Why?

Sep 10, 2020, 7:56 PM

Note that one of the reasons I want to change the

_type
is because the content sidebar is sorted by the type field, not the title of the schema types, so leaving it alone gives me a giant headache having to explain why it's mostly sorted, but not really.

Sep 10, 2020, 8:01 PM

can't help with the patch issue, but could you create a custom desk structure and sort them yourself?

Sep 10, 2020, 9:02 PM

Something like

S.documentTypeListItems().sort( /* sort by title */ )

Sep 10, 2020, 9:02 PM

Haven't tried to do that for the content sorting, but that seems incredibly silly to need to recreate a component because the default sort is on a visually hidden field instead of the visually prominent title.
I'll have to throw that on my checklist of things to do anyway, since there are some document types I've created that are purely administrative, so I want to implement grouping of document types.

Alas, WYSIWYG editing is higher on my priority list for the higher complexity schemas though.

Sep 10, 2020, 9:06 PM

export default () =>
  S.list()
    .title('Content')
    .items(
      S.documentTypeListItems().sort((a, b) =>
        a.spec.title.localeCompare(b.spec.title),
      ),
    );

Sep 10, 2020, 9:06 PM

hah, well best of luck with it either way!

Sep 10, 2020, 9:07 PM

Thanks for the tip though, saved that for later when I inevitably start bashing my head against my keyboard trying to remember why I know I dont know how to do that.

Sep 10, 2020, 9:11 PM

Hi, this is tricky one since _type is immutable you have to do a full on migration to rename it. Here's a snippet that should help you on the way https://www.github.com/sanity-io/sanity-recipes/tree/master/snippets%2FmigrateDocumentType.js

Sep 11, 2020, 6:07 AM

Ugh. That script doesn't look like it'd handle a deeply nested reference in there. Yeah, gonna pass on renaming the type for now.

Sep 11, 2020, 5:29 PM

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.