Skip to content
Document DB v12 - Improved Interceptors with Soft Delete Integration, AI protections, & Admin UI with Aspire Integration!How!?

Browse & edit

A paged, sortable grid whose columns are inferred by sampling documents — nested paths like shipTo.city become first-class columns.

Browse grid for the Order type with columns inferred from nested JSON paths

Numeric filters and sorts compare numerically, so 9 < 10 rather than "9" > "10".

Search matches across the string fields found by sampling — the quick way in when you know a value but not which field holds it.

+ Filter builds conditions on any envelope column or JSON path: =, , contains, starts with, ends with, comparisons, and null checks. Several conditions combine with AND.

Browse grid filtered to customerTier equals enterprise, showing 1,020 matching documents

Columns picks which of the sampled paths to show, for a type whose documents are wider than a screen.

For anything the filter row can’t express — an OR, a function, a projection — use the query console, which speaks DocumentDb’s own string grammar over the same connection.

Any row expands into a read-only, syntax-highlighted view of its whole body, with objects and arrays collapsible (native <details> elements, so it works with scripting off) and a toggle to the raw pretty-printed text.

A browse row expanded into a formatted, collapsible JSON view

Every value is HTML-escaped on the way out: document content belongs to whoever wrote it, and this markup is rendered raw.

Long numeric arrays — embeddings — render as float[1536] [0.021, -0.114, …] in both the grid and the formatted view rather than component by component. Nothing is hidden: the raw toggle still shows the whole body. It is the difference between a summary and tens of kilobytes of markup per row.

Every sidecar is keyed by document id, so each row carries a History, Blobs and Geometry link beside its JSON and Edit buttons. They open the same tab the header would, already narrowed to that one document — and each of those tabs keeps its own control to widen back out to the whole type.

A link only appears when the thing behind it exists: History when the table has a {table}_history sidecar, Blobs when it has {table}_blobs, Geometry when the type stores GeoJSON. A plain type gets a plain row rather than three dead ends.

The trip back works too: the document id in the History, Blobs and Geometry listings is a link, and clicking it opens the live document body in a read-only overlay. A sidecar row is about a document it does not show, and an id on its own rarely says which one. If nothing comes back — a removed document still carrying history, a payload that outlived its owner — the overlay says so instead of failing.

A JSON editor with format and validation. Insert, edit, duplicate-by-id, single and bulk delete.

The edit document dialog showing the id field and a formatted JSON body

Writes carry the sidecars with them, because nothing in the database does it for you:

  • deleting a document clears its blob rows,
  • a temporal type records the version, stamped with the actor shiny-docdb-myadmin,
  • a vector-mapped type has its embedding re-indexed — or, where the tool cannot write the sidecar, says so instead of leaving a search index quietly disagreeing with the documents,
  • full-text indexes need nothing, because the database maintains them.

Clear is the one exception, matching the library: a bulk delete is not tracked in history.

The + Document button writes the first document of a type — which is how a type comes into existence in a schema-free store. Creating the documents table itself is on the database overview, using the provider’s own DDL, so a database whose store has never run isn’t a dead end.