Dataview's dv.pages() vs dv.list()
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:
| Function | Returns | Use For |
|---|---|---|
dv.pages() | DataArray of pages | Filtering, mapping, querying |
dv.list() | Rendered list | Output display |
dv.table() | Rendered table | Output display |
dv.taskList() | Rendered tasks | Output 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.