GROQ Query for new and unpublished Documents
Not all Unpublished Documents are created equal
By Simeon Griggs & Peter
Querying for Draft Documents
{
"unpublishedAll": *[_id in path("drafts.**")],
"unpublishedNew": *[_id in path("drafts.**") && count(*[^._id == "drafts." + _id]) == 0],
"unpublishedModified": *[count(*[_id in [^._id, "drafts." + ^._id]]) > 1]
}Draft / Unpublished Documents can be queried by looking for any Document which has an _id that begins with drafts. but determining if the Document has ever been Published before requires more work.
An existing, previously published Document with unpublished changes will exist as two Documents that can be returned by an authenticated query, their _id's look something like:
asdf-1234drafts.asdf-1234
However, a new Document that has never been published will only exist with an _id that begins with drafts.
When this snippet is run, the number of results in unpublishedAll should equal the sum of the results in unpublishedNew and unpublishedModified.
Note: These example queries are not optimised and are intended for use cases like document lists for your Dashboard.
The three query keys explained:
unpublishedAllwill return all Documents with an_idbeginning withdrafts.unpublishedNewdoes the same search but only returns Documents for which it can also find Published_id's.unpublishedModifiedfinds as many Documents where both a published and draft_idfor the same document exist.
Contributors

Simeon Griggs
Customer Education at Sanity

Peter
Runs Support @ Sanity.io
Spain