Dataview's dv.pages() vs dv.list()

· 1 min read
obsidian dataview pkm

The Problem

I kept mixing up Dataview query functions and getting unexpected results:

dv.list(dv.pages("#project"))  // Works but verbose
dv.pages("#project")           // Returns objects, not a list

The Solution

dv.pages() - Returns page objects with all metadata:

dv.pages("#project").where(p => p.status === "active")

dv.list() - Renders an array as a bullet list:

dv.list(dv.pages("#project").map(p => p.file.link))

Why It Works

They serve different purposes:

FunctionReturnsUse For
dv.pages()DataArray of pagesFiltering, mapping, querying
dv.list()Rendered listOutput display
dv.table()Rendered tableOutput display
dv.taskList()Rendered tasksOutput display

The pattern is usually:

// Query > Transform > Display
dv.table(
  ["Name", "Status", "Due"],
  dv.pages("#project")
    .where(p => p.status !== "done")
    .sort(p => p.due)
    .map(p => [p.file.link, p.status, p.due])
)

Common mistake: calling dv.list() on a pages query without mapping to links:

// Shows [object Object]
dv.list(dv.pages("#project"))

// Shows clickable links
dv.list(dv.pages("#project").file.link)

The Dataview docs are thorough but dense. This pattern covers 80% of use cases.

Available for Node.js and TypeScript contracts

I take over platforms that already exist and are in trouble. Node, TypeScript, React and Laravel, mostly in regulated or high-traffic environments. If something needs rescuing, re-platforming or finishing, my full history is on the CV.

Related Posts

Comments