> **Dataview** est un plugin très populaire pour [Obsidian](https://obsidian.md), l’application de prise de notes en Markdown. > > > > En quelques mots : > > > > **Dataview** permet de **transformer ton espace de notes en une base de données dynamique**. > > > > Autrement dit : > > - Il _collecte_ des informations contenues dans tes fichiers Markdown (les métadonnées comme les tags, les YAML, les dates, les liens internes, etc.). > > - Il _les filtre, trie, regroupe et affiche_ sous forme de listes, tableaux, calendriers ou requêtes plus complexes. > > - Il peut générer ces vues automatiquement et les mettre à jour en temps réel quand tu modifies tes notes. > > > > > En pratique, tu peux par exemple : > > - Lister toutes les notes avec un certain tag. > > - Compter combien de notes tu as publiées. > > - Générer un index des tâches non terminées. > > - Faire des requêtes sur les dates (notes créées la semaine dernière, événements à venir, etc.). > > > > > On peut l’utiliser de deux façons principales : > > - **Dataview simple (Dataview Query Language – DQL)** : des blocs table, list ou task avec une syntaxe declarative (similaire au SQL simplifié). > > - **DataviewJS** : du JavaScript complet pour créer des requêtes plus avancées et personnaliser l’affichage. - - - #tagindex/PKM💡/Obsidian/pluginObsi - - - ### Concepts associés - [[requête dataview]] - - - Sources 🔗 - https://obsidian.rocks/dataview-in-obsidian-a-beginners-guide/ - https://www.youtube.com/watch?v=6p5Eb1sqgIY - https://obsidian.rocks/quick-tip-quickly-organize-notes-in-obsidian/ - - - - Pour publier en ligne le résultat des requêtes, utiliser le plugin [[dataview publisher]]. --- [[Peut-on appeler l'écriture de requêtes dataview du codage ?]] - - - ### Liste des notes qui ont "input" dans leur nom de note ```dataview table file.name as "Fichier" from "" where contains(file.name, "input") ``` - - - %% ### Dataview types : - List - Table - Task - Calendar ### query components - from: Which files to search. - where: Filter logic. - il sert à filtrer . exeploe : where le file name contient "geaorges" - - sort: Ordering. - limit: Max results. - group by: Grouping. - permet de grouper les résultats suivant une certaine [[property obsi]] genre "auteur" ou quoi) - - flatten: Unpack lists.%% - - - ### comment obtenir une liste des notes appartenant au folder X avec dataview dans obsidian ```dataview table file.name as "Note" from "Date" ``` - - - #### Comment obtenir une liste des notes appartenant au folder "journal" et qui sont taguées par le tag "journalpublique" (avec dataview dans obsidian) ```dataview table file.name as "Note" from "Journal 📆" where contains(file.tags, "#journalpublique") ``` - - - ### comment avoir une liste de note classée par celles qui ont e plus de connexions (dans Obsidian) ```dataview table length(file.inlinks) + length(file.outlinks) as Total_Links from "" sort (length(file.inlinks) + length(file.outlinks)) desc limit 30 ``` - - - - - - ### liste moi avec dataview les notes insérées en référence de ma note "**idée**" qui n'ont pas de le tag "published" OU qui n'ont pas écrit dans leur note "%%pusblished%%" ```dataview list from [[idée]] where !contains(file.tags, "published") or !contains(join(rows.file.content), "%%published%%") ``` #### **Ce que fait vraiment** **from "chat" - from chat **ne liste pas les notes liées depuis la note “chat”** (c’est-à-dire les notes que “chat” référence), - mais plutôt les notes **qui ont un lien vers la note “chat”** (c’est-à-dire les notes qui contiennent un lien vers “chat”). Autrement dit, from chat cherche toutes les notes qui **pointent vers “chat”** — pas celles que “chat” pointe. #### **Pourquoi ça peut poser problème ici** Si tu veux lister les notes **référencées dans ta note “chat”** (c’est-à-dire les notes que tu as _liées depuis_ “chat”), Dataview **ne propose pas directement** une fonction pour faire ça. - - - ### liste moi mes 20 dernières notes avec le tag "published" %% DATAVIEW_PUBLISHER: start ```dataview table file.mtime as "Dernière modification" from #published✔︎ sort file.mtime desc limit 20 ``` %% | File | Dernière modification | | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | | [[Religion/Islam/Allah.md\|Allah]] | 12:41 AM - July 21, 2025 | | [[Religion/Islam/signes de la fin des temps dans l’islam.md\|signes de la fin des temps dans l’islam]] | 12:40 AM - July 21, 2025 | | [[Religion/Islam/résurrection (dans l'Islam).md\|résurrection (dans l'Islam)]] | 12:39 AM - July 21, 2025 | | [[Religion/Christiannisme/David Et Golliath.md\|David Et Golliath]] | 12:38 AM - July 21, 2025 | | [[Religion/Christiannisme/Daniel dans la fosse aux lions.md\|Daniel dans la fosse aux lions]] | 12:37 AM - July 21, 2025 | | [[antithèse.md\|antithèse]] | 12:32 AM - July 21, 2025 | | [[Philosophie 🤔/dialectique.md\|dialectique]] | 12:30 AM - July 21, 2025 | | [[Concepts fondamentaux (CFo)/vérité.md\|vérité]] | 12:29 AM - July 21, 2025 | | [[Philosophie 🤔/Nietzsche/Surhomme.md\|Surhomme]] | 12:29 AM - July 21, 2025 | | [[Personne 👤/Friedrich Nietzsche.md\|Friedrich Nietzsche]] | 12:29 AM - July 21, 2025 | | [[PKM/Éléments (notes taguées)/tag index 🗂️.md\|tag index 🗂️]] | 12:29 AM - July 21, 2025 | | [[Enseigner 👨‍🏫 (notes taguées)/Le Rôle D'un Philosophe Est De Guider Les Autres (Selon Platon).md\|Le Rôle D'un Philosophe Est De Guider Les Autres (Selon Platon)]] | 12:29 AM - July 21, 2025 | | [[théorie des idées.md\|théorie des idées]] | 12:27 AM - July 21, 2025 | | [[Concepts fondamentaux (CFo)/théorie.md\|théorie]] | 12:27 AM - July 21, 2025 | | [[Sources 🔗/Citations/en théorie, il n'y a pas de différence entre la théorie et la pratique. En pratique, si..md\|en théorie, il n'y a pas de différence entre la théorie et la pratique. En pratique, si.]] | 12:26 AM - July 21, 2025 | | [[monde sensible.md\|monde sensible]] | 12:25 AM - July 21, 2025 | | [[Concepts fondamentaux (CFo)/impermanence.md\|impermanence]] | 12:24 AM - July 21, 2025 | | [[monde intelligible.md\|monde intelligible]] | 12:22 AM - July 21, 2025 | | [[l'alégorie de la caverne.md\|l'alégorie de la caverne]] | 12:20 AM - July 21, 2025 | | [[Concepts fondamentaux (CFo)/conclusion.md\|conclusion]] | 12:08 AM - July 21, 2025 | %% DATAVIEW_PUBLISHER: end %% ### générèe moi un tableau listant mes tags "liéà" avec dataview imp. avec data view mais avec ```dataview list flatten file.tags as tag where startswith(tag, "#liéà/") group by tag ``` - - - ### Comment afficher le nombre de notes publiées sur mon site obsidian published avec dataview? c'est possible avec  une [[requête DataviewJS]] ```dataviewjs // Compter les fichiers qui ont le tag #published let publishedNotes = dv.pages('#published✔︎'); dv.paragraph(`Nombre de notes avec #published : **${publishedNotes.length}**`); ``` ```dataviewjs // Compter toutes les notes let allNotes = dv.pages(); dv.paragraph(`Nombre total de notes : **${allNotes.length}**`); ``` - - - ### comment mettre un espace de libre dans cette liste toutes les 5 entrées ? "v" ```dataviewjs const pages = dv.pages("#film").sort(p => p.file.name); let i = 0; for (let page of pages) {     dv.paragraph(`- [[${page.file.name}]]`);     i++;     if (i % 5 === 0 && i < pages.length) {         dv.el("hr"); // ligne de séparation     } } ``` - - - ### but : avoir tous les tags séparés dès quon change de de tag #### liste moi avec dataviewjs, tous mes tags qui commence par "liéà/" ```dataviewjs // Récupère toutes les pages du vault const pages = dv.pages(); // Récupère tous les tags let tags = []; for (let page of pages) { if (page.file?.tags) { for (let tag of page.file.tags) { if (typeof tag === "string" && tag.startsWith("#liéà/")) { tags.push(tag); } } } } // Supprime les doublons et trie let uniqueTags = [...new Set(tags)].sort(); // Affiche if (uniqueTags.length > 0) { dv.list(uniqueTags); } else { dv.paragraph("Aucun tag commençant par `#liéà/` trouvé."); } ```     #### parfait, maintenant modifie pour avoir un espace dès qu'on passe à un sous tag ```dataviewjs // Récupère toutes les pages du vault const pages = dv.pages(); // Récupère tous les tags commençant par #liéà/ let tags = []; for (let page of pages) { if (page.file?.tags) { for (let tag of page.file.tags) { if (typeof tag === "string" && tag.startsWith("#liéà/")) { tags.push(tag); } } } } // Supprime les doublons et trie let uniqueTags = [...new Set(tags)].sort(); // Regroupe les tags par leur "sous-tag" principal let groups = {}; for (let tag of uniqueTags) { let subtag = tag.split("/")[1] || "Autre"; if (!groups[subtag]) { groups[subtag] = []; } groups[subtag].push(tag); } // Trie les groupes par ordre alphabétique let sortedGroupKeys = Object.keys(groups).sort(); // Affiche for (let key of sortedGroupKeys) { dv.header(3, `Sous-tag : ${key}`); dv.list(groups[key]); } ``` #### pas mal, mais enlève les titres "sous tag : "nom du tag" qui apparaissent à chaque fois ```dataviewjs const pages = dv.pages(); // Récupérer tous les tags commençant par #liéà/ let tags = []; for (let page of pages) { if (page.file?.tags) { for (let tag of page.file.tags) { if (typeof tag === "string" && tag.startsWith("#liéà/")) { tags.push(tag); } } } } // Supprimer les doublons et trier let uniqueTags = [...new Set(tags)].sort(); // Regrouper les tags par leur sous-tag principal (après liéà/) let groups = {}; for (let tag of uniqueTags) { let subtag = tag.split("/")[1] || "Autre"; if (!groups[subtag]) { groups[subtag] = []; } groups[subtag].push(tag); } // Afficher sans titres, mais avec espace entre chaque groupe let sortedGroupKeys = Object.keys(groups).sort(); for (let key of sortedGroupKeys) { dv.list(groups[key]); dv.paragraph(""); // espace visuel entre les groupes } ``` ### peut tu à la place d'un espace blanc mettre une ligne verticale pour mieux délimiter les parties ? ```dataviewjs const pages = dv.pages(); // Récupérer tous les tags commençant par #liéà/ let tags = []; for (let page of pages) { if (page.file?.tags) { for (let tag of page.file.tags) { if (typeof tag === "string" && tag.startsWith("#liéà/")) { tags.push(tag); } } } } // Supprimer les doublons et trier let uniqueTags = [...new Set(tags)].sort(); // Regrouper les tags par leur sous-tag principal (après liéà/) let groups = {}; for (let tag of uniqueTags) { let subtag = tag.split("/")[1] || "Autre"; if (!groups[subtag]) { groups[subtag] = []; } groups[subtag].push(tag); } // Afficher sans titres, mais avec ligne verticale entre chaque groupe let sortedGroupKeys = Object.keys(groups).sort(); for (let i = 0; i < sortedGroupKeys.length; i++) { let key = sortedGroupKeys[i]; dv.list(groups[key]); // Ligne verticale comme séparation sauf après le dernier groupe if (i < sortedGroupKeys.length - 1) { dv.paragraph(`<div style="border-left: 2px solid #888; height: 20px; margin: 10px 0;"></div>`); } } ``` - - -