Chapitre 05
Dataview : interroger ses propres notes
Objectifs du chapitre
- Ăcrire les quatre formes de requĂȘte :
LIST,TABLE,TASK,CALENDAR. - Sélectionner une source avec
FROM, filtrer avecWHERE, trier et grouper. - Utiliser les champs implicites que Dataview expose sur chaque note, sans que tu les aies écrits.
- ReconnaĂźtre le piĂšge de
GROUP BY, qui produit un tableau vide sans le moindre message d'erreur. - Comprendre pourquoi ce plugin est ce qui rend une arborescence plate viable.
1. L'idée
Dataview lit le front-matter de toutes les notes du vault et t'en donne une vue de base de donnĂ©es. Tu Ă©cris une requĂȘte dans un bloc de code, et Obsidian affiche le rĂ©sultat, recalculĂ© Ă chaque ouverture de la note.
C'est le pendant du chapitre 3 : le front-matter est le contrat, Dataview est le moteur qui l'exploite. Sans lui, un vault plat n'est qu'un tas de fichiers ; avec lui, le classement se reconstruit Ă la demande, sous autant d'angles que tu veux.
```dataview
TABLE status, repo, updated
FROM "30-projets"
WHERE type = "project" AND status = "active"
SORT updated DESC
```
Le renversement Ă saisir : tu ne ranges plus, tu dĂ©cris. Une note bien dĂ©crite apparaĂźt toute seule dans toutes les vues qui la concernent â et dans celles que tu inventeras dans six mois, sans avoir Ă la dĂ©placer.
2. Les quatre formes de requĂȘte
| Forme | Produit | Quand |
|---|---|---|
LIST | Une liste de liens | « Quelles notes⊠? » |
TABLE | Un tableau, une colonne par expression | « Quelles notes, et avec quelles valeurs ? » |
TASK | Les cases à cocher, cochables depuis la vue | « Que reste-t-il à faire ? » |
CALENDAR | Un calendrier pointé par une date | Rare ; joli, peu actionnable |
LIST
FROM "20-notes"
WHERE type = "concept"
SORT file.name ASC
TABLE WITHOUT ID file.link AS Note, updated AS "DerniĂšre touche"
FROM "20-notes"
LIMIT 10
TASK
FROM "30-projets"
WHERE !completed
WITHOUT ID supprime la premiÚre colonne, ajoutée d'office, qui contient le lien
vers la note. Ă utiliser dĂšs que tu veux maĂźtriser tes colonnes, comme ci-dessus oĂč le lien est
remis Ă la main sous un nom choisi.
3. Choisir la source
FROM restreint l'ensemble de dĂ©part. Sans lui, la requĂȘte porte sur tout le
vault.
FROM "30-projets" -- un dossier (guillemets obligatoires)
FROM #safety -- une étiquette
FROM [[profinet]] -- les notes qui pointent VERS cette note
FROM outgoing([[profinet]]) -- les notes QUE cette note cite
FROM "20-notes" AND #safety -- combinaisons avec AND / OR / -
FROM "20-notes" AND -#Ă -trier
FROM [[une note]] mĂ©rite d'ĂȘtre connu : c'est la version interrogeable des
liens retour. Placé dans une fiche projet, il liste toutes les notes quotidiennes qui l'ont
citĂ©e â un journal de projet reconstituĂ© sans qu'on l'ait jamais tenu.
4. Les champs implicites
Au-delĂ de ton front-matter, Dataview expose sur chaque note un objet file que
tu n'as rien eu Ă remplir :
| Champ | Contenu |
|---|---|
file.name | Nom sans extension |
file.link | Lien cliquable vers la note |
file.folder | Dossier parent |
file.ctime / file.mtime | Création et modification, vues par le systÚme de fichiers |
file.tags | Ătiquettes, corps et front-matter confondus |
file.inlinks / file.outlinks | Liens entrants et sortants |
file.tasks | Les cases Ă cocher de la note |
file.ctime et file.mtime viennent du systĂšme de
fichiers, pas de toi. Un git clone, une copie, une synchronisation les
réécrivent toutes à la date de l'opération. C'est exactement pourquoi le schéma du
chapitre 3 porte ses propres created et updated : eux voyagent avec
le contenu.
Les champs en ligne
Dataview lit aussi des champs posés dans le corps de la note, avec un double deux-points :
Mesure effectuée le terrain. duree:: 45min
- [ ] Reprendre l'essai [échéance:: 2026-09-01]
Pratique pour annoter une ligne précise. à utiliser avec parcimonie : ces champs échappent au front-matter, donc au contrat du chapitre 3, donc au validateur.
5. Filtrer, trier, limiter
WHERE type = "project" AND status != "closed"
WHERE contains(tags, "safety")
WHERE created >= date(2026-01-01)
WHERE length(file.inlinks) = 0
WHERE contains(projects, this.file.link)
SORT updated DESC, file.name ASC
LIMIT 20
this dĂ©signe la note qui contient la requĂȘte. C'est ce qui permet d'Ă©crire une
requĂȘte gĂ©nĂ©rique dans un template : la mĂȘme ligne, recopiĂ©e dans chaque fiche projet,
donne à chaque fois le bon résultat.
Les fonctions les plus utiles : contains(liste, valeur),
length(liste), date(âŠ) et dur(âŠ),
choice(test, si_vrai, si_faux), filter(), map(),
sum(), round().
6. Grouper â et le piĂšge
GROUP BY regroupe les résultats par la valeur d'une expression. Et il change ce
qui est visible Ă partir de lĂ , ce que la documentation ne crie pas assez fort.
TABLE repo, updated
FROM "30-projets"
WHERE type = "project"
GROUP BY status
Cette requĂȘte s'affiche sans erreur, avec les bons groupes⊠et deux colonnes intĂ©gralement vides.
AprÚs GROUP BY, une ligne de résultat n'est plus une note : c'est un groupe.
Deux choses seulement existent Ă ce niveau â la clĂ© du groupe (key) et
rows, le tableau des notes qui le composent. repo et
updated n'y sont pas définis, donc s'affichent vides.
Il faut passer par rows :
TABLE rows.file.link AS Projet, rows.repo, rows.updated
FROM "30-projets"
WHERE type = "project"
GROUP BY status
Ce dĂ©faut est passĂ© au travers d'une revue dans le vault de la partie II : la requĂȘte s'affichait, les groupes Ă©taient corrects, et personne ne remarquait les colonnes vides. Aucun test ne peut l'attraper â seule la lecture du rĂ©sultat le rĂ©vĂšle.
FLATTEN fait l'inverse : il déplie une liste pour produire une ligne par
élément. Utile pour éclater les étiquettes ou les liens d'une note.
TABLE file.link
FROM "10-journal"
FLATTEN projects AS project
WHERE project = this.file.link
7. Les trois vues du vault de référence
Dans le vault de la partie II, les vues sont des notes ordinaires rangées
dans 90-meta/vues/. Elles sont donc versionnées, liables, et modifiables sans
toucher Ă la configuration.
Tableau de bord
TABLE status, repo, updated
FROM "30-projets"
WHERE type = "project" AND status = "active"
SORT updated DESC
Complété par la liste de l'inbox à trier et, via le plugin Tasks, les tùches en retard.
Concepts orphelins
LIST
FROM "20-notes"
WHERE type = "concept"
AND length(file.inlinks) = 0
AND (!see_also OR length(see_also) = 0)
SORT file.name ASC
C'est le dĂ©tecteur de base de connaissance qui pourrit : une fiche que rien ne cite et qui ne cite rien ne sera jamais relue. La double condition couvre les deux formes d'absence â champ inexistant, et champ prĂ©sent mais vide.
8. Dataview JS, et quand s'arrĂȘter
Dataview offre aussi un mode JavaScript, dataviewjs, oĂč tu construis le rendu
Ă la main. Il permet tout, y compris des choses qu'on regrette.
Trois raisons de rester sur le langage de requĂȘte tant que possible : le JavaScript s'exĂ©cute Ă chaque affichage et peut ralentir sĂ©rieusement une note ; il est illisible pour qui reprend le vault ; et il permet d'Ă©crire dans le vault, donc de casser des choses depuis ce qui devrait n'ĂȘtre qu'un affichage.
Si une vue demande vraiment du JavaScript, demande-toi d'abord si le schĂ©ma de front-matter n'est pas en cause. Les neuf fois sur dix, la requĂȘte complexe compense une donnĂ©e mal structurĂ©e.
Récapitulatif
- Quatre formes :
LIST,TABLE,TASK,CALENDAR.WITHOUT IDpour maßtriser les colonnes. FROMaccepte dossier, étiquette, lien entrant,outgoing(), et leurs combinaisons.- L'objet
fileexpose des champs que tu n'as pas Ă©crits â maisfile.ctimement aprĂšs un clone. thisdĂ©signe la note porteuse : c'est ce qui rend une requĂȘte gĂ©nĂ©rique dans un template.- AprĂšs
GROUP BY, seulskeyetrowsexistent. Tout le reste s'affiche vide, sans erreur. - Une requĂȘte compliquĂ©e est presque toujours le symptĂŽme d'un front-matter mal conçu.
Exercices
Exercice 1 â Ăcrire la requĂȘte
Ăcris une requĂȘte qui liste, sous forme de tableau, les fiches de 20-notes
touchées depuis le 1er juillet 2026, avec leur date de mise à jour et leur nombre
de liens entrants, les plus citées d'abord.
Voir la solution
TABLE WITHOUT ID file.link AS Fiche,
updated AS "Mise Ă jour",
length(file.inlinks) AS Citations
FROM "20-notes"
WHERE type = "concept" AND updated >= date(2026-07-01)
SORT length(file.inlinks) DESC
Points d'attention : date(2026-07-01) sans guillemets â c'est un littĂ©ral de
date, pas une chaßne ; length(file.inlinks) se répÚte dans la colonne et dans
le tri, Dataview ne permet pas de trier sur l'alias ; et WITHOUT ID évite la
colonne de lien en double.
Exercice 2 â RĂ©parer la requĂȘte
Cette requĂȘte affiche les bons groupes mais des colonnes vides. Corrige-la, et explique en une phrase pourquoi elle ne produisait aucune erreur.
TABLE title, created
FROM "20-notes"
GROUP BY type
Voir la solution
TABLE rows.file.link AS Note, rows.title, rows.created
FROM "20-notes"
GROUP BY type
Pourquoi pas d'erreur : aprĂšs GROUP BY, title
et created ne sont pas des noms invalides, ce sont des champs simplement absents
du contexte de groupe. Dataview traite un champ absent comme vide â comportement voulu, qui
évite qu'une note sans le champ fasse planter toute la vue. Le coût, c'est qu'une faute de
frappe ou une erreur de portée passe inaperçue.
Le rĂ©flexe Ă prendre : une colonne vide sur toutes les lignes n'est pas un vault mal rempli, c'est une requĂȘte fausse.
Exercice 3 â Concevoir la vue manquante
Tu veux repérer les notes quotidiennes qui mentionnent un projet dont le
status est closed â signe que tu travailles encore sur quelque chose
que tu crois terminé. Comment t'y prends-tu ?
Voir la solution
La difficulté est que la condition porte sur une propriété de la note liée, pas de la note courante. Il faut déplier les liens puis suivre le lien :
TABLE WITHOUT ID file.link AS Jour, project AS Projet
FROM "10-journal"
FLATTEN projects AS project
WHERE project AND project.status = "closed"
SORT file.name DESC
FLATTEN produit une ligne par projet cité, puis project.status
déréférence le lien pour lire le front-matter de la cible.
Le WHERE project AND ⊠n'est pas décoratif : une note quotidienne sans
projects produit un project nul, et déréférencer nul remonterait une
erreur.
Autre approche, plus simple Ă lire mais moins directe : partir des projets clos et lister
leurs liens entrants avec FROM [[âŠ]]. Il faudrait alors une requĂȘte par projet
â d'oĂč l'intĂ©rĂȘt de la version ci-dessus, qui tient en une vue.