Issue with filtering out a document by ID in Sanity Studio using desk structure.

8 replies
Last updated: Apr 20, 2021
I’m trying to figure out how to filter out a document by an ID in sanity studio using desk structure
S.listItem()
        .title("Audit template")
        .icon(FaBible)
        .child(
          S.document()
            .schemaType("revisionTemplate")
            .documentId("sourceDocument")
        ),
      S.listItem()
        .title("Audits")
        .child(
          S.document()
            .filter((item) => item.getId() !== "sourceDocument")
            .schemaType("revisionTemplate")
        ),
Here I’m trying to keep the version of revisionTemplate with a set documentId seperated from all the instances of the document
AI Update

Looking at your code, I can see the issue. When you want to create a filtered list of documents in Structure Builder, you should use S.documentList() or S.documentTypeList() instead of S.document(), since S.document() is for rendering a single specific document, not a list.

Here's how to fix your code:

S.listItem()
  .title("Audit template")
  .icon(FaBible)
  .child(
    S.document()
      .schemaType("revisionTemplate")
      .documentId("sourceDocument")
  ),
S.listItem()
  .title("Audits")
  .child(
    S.documentList()
      .title("Audits")
      .filter('_type == "revisionTemplate" && _id != "sourceDocument"')
      .schemaType("revisionTemplate")
  ),

The key changes:

  1. Use S.documentList() instead of S.document() - this creates a list view that can display multiple documents
  2. Use the .filter() method with a GROQ query - the filter takes a GROQ string, not a function. In your case: '_type == "revisionTemplate" && _id != "sourceDocument"'
  3. Add a .title() to give your list a proper heading

This setup will give you two separate list items in your Structure:

  • "Audit template" - shows only the single document with ID "sourceDocument"
  • "Audits" - shows all other revisionTemplate documents except the one with ID "sourceDocument"

The Structure Builder documentation explains that S.documentList() is specifically designed for creating filtered lists of documents, and it accepts GROQ filter strings to query which documents to display. You can also check out the getting started guide for more examples of filtering and organizing documents.

Could you try:

.filter(item => !['sourceDocument'].includes(item.getId()))
I should have included the error
TypeError: _structureBuilder.default.document(...)
  .filter is not a function
It seems like I can’t call filter where I am trying to call it
And
...S.documentTypeListItems()
instead of
S.document()
.
You may also need the top-level to be
S.list()
containing
.items([...])
. In
.items([])
are
S.listItem()
(Audit template) and
…S.documentTypeListItems()
. If you scroll up a few threads you’ll see Giacomo’s example—I think that structure would work.
Hmm adding it to documentTypeListItems seems to produce the same error
Will check out the example
🙂
I think I already have that, I tried the filter to S.documentTypeListItems but I still see the document under my audits tab
S.listItem()
        .title("Audit template")
        .icon(FaBible)
        .child(
          S.document()
            .schemaType("revisionTemplate")
            .documentId("sourceDocument")
        ),
      S.listItem()
        .title("Audits")
        .child(S.documentTypeList("revisionTemplate").title("Audits")),

      ...S.documentTypeListItems().filter(
        hiddenDocTypes,
        (item) => !["sourceDocument"].includes(item.getId())
      ),

https://pastebin.com/TW0bPQ20
Hmm I added the document to my hiddenDocTypes but I setill se the document when I query for the documentTypeList

S.listItem()
        .title("Audits")
        .child(S.documentTypeList("revisionTemplate").title("Audits")),

      S.listItem()
        .title("Audit template")
        .icon(FaBible)
        .child(
          S.document()
            .schemaType("revisionTemplate")
            .documentId("sourceDocument")
        ),

https://pastebin.com/Z9QV91D9
Turns out sanity has something nifty called filterThis worked:

S.listItem()
        .title("Audits")
        .child(
          S.documentTypeList("revisionTemplate")
            .title("Audits")
            .filter('_type == "revisionTemplate" && _id!="sourceDocument"')
        ),

Sanity – Build the way you think, not the way your CMS thinks

Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.

Was this answer helpful?