Obsidian et ses fonctions

Obsidian Bases : référence de syntaxe, filtres et fonctions

Obsidian Bases décrit des vues sur les fichiers d’un coffre à l’aide de filtres, de propriétés et de formules, écrits en YAML dans un fichier .base ou dans un bloc base. Cette référence reprend toute la syntaxe documentée : sections du fichier, filtres, opérateurs et dates, propriétés, fonctions par type, formules, résumés et clés de vue. Elle est à jour d’Obsidian 1.15.1 (documentation vérifiée le 9 novembre 2026). Ses exemples ont été testés le 9 novembre 2026 dans Obsidian 1.15.0 (Windows 11) ; d’après le journal des versions, la 1.15.1 ne modifie pas Bases. Les exemples doivent être essayés sur une copie avant leur utilisation dans le coffre de travail.

Si vous découvrez Obsidian Bases, créez d’abord une première base avec le guide Obsidian Bases, puis revenez ici pour la syntaxe.

Illustration : une aiguille de cuivre traverse un paquet de fiches perforées ; quelques fiches encochées sont tombées à part.
Des conditions écrites retiennent exactement les notes qui y répondent.
Sommaire 12 sections
  1. Créer et intégrer une base
  2. Structure d’un fichier .base
  3. Filtres
  4. Opérateurs
  5. Propriétés : note, file, formula et this
  6. Fonctions par type
  7. Formules
  8. Résumés
  9. Clés d’une vue
  10. Pièges fréquents
  11. FAQ Bases
  12. Un exemple minimal à vérifier sur copie

Créer et intégrer une base

  • Fichier .base : palette de commandes → « Bases: Créer une nouvelle base », clic droit sur un dossier → « Nouvelle base », ou ruban → « Créer une nouvelle base ». Depuis la palette, le fichier va dans le dossier de la note active si le réglage des nouvelles notes du coffre vaut « même dossier que le fichier actuel », sinon dans le dossier fixé par ce réglage.
  • Bloc dans une note : « Bases: Insérer une nouvelle base », ou un bloc de code base qui contient la même syntaxe qu’un fichier.
  • Intégrer un fichier : ![[Nom.base]] affiche la première vue de la liste ; ![[Nom.base#Nom de la vue]] affiche une vue précise. Renommer une vue met à jour les liens et intégrations qui la citent (Obsidian 1.10.2).
filters:
  and:
    - file.hasTag("example")
views:
  - type: table
    name: Table

On modifie d’ordinaire une base dans l’interface ; Obsidian écrit le YAML. L’écrire à la main reste possible, à condition que le fichier soit du YAML valide.

Structure d’un fichier .base

Une base contient jusqu’à cinq sections : filters, formulas, properties, summaries et views. Exemple complet, d’après la documentation :

filters:
  or:
    - file.hasTag("tag")
    - and:
        - file.hasTag("book")
        - file.hasLink("Textbook")
    - not:
        - file.hasTag("book")
        - file.inFolder("Required Reading")
formulas:
  formatted_price: 'if(price, price.toFixed(2) + " €")'
  ppu: "(price / age).round(2)"
properties:
  note.status:
    displayName: Statut
  formula.formatted_price:
    displayName: "Prix"
summaries:
  moyenne_arrondie: 'values.reduce(acc + value, 0) / values.length'
views:
  - type: table
    name: "Ma table"
    limit: 10
    groupBy:
      property: note.age
      direction: DESC
    filters:
      and:
        - 'status != "done"'
        - or:
            - "formula.ppu > 5"
            - "price > 2.1"
    order:
      - file.name
      - note.age
      - formula.ppu
      - formula.formatted_price
    summaries:
      formula.ppu: Average

Les chemins de dossier se lisent depuis la racine du coffre : ici, Required Reading est un dossier de premier niveau.

SectionRôle
filtersConditions communes à toutes les vues.
formulasPropriétés calculées, utilisables dans toutes les vues.
propertiesRéglages par propriété, par exemple displayName (nom de colonne). Une propriété de note s’y écrit avec son préfixe (note.status) : sans préfixe (status), le réglage reste sans effet dans Obsidian 1.15.0. Les noms d’affichage ne servent ni aux filtres ni aux formules.
summariesRésumés personnalisés, à ne pas confondre avec la clé summaries d’une vue, qui attribue un résumé à une colonne.
viewsListe des vues : chacune a son type, son nom, ses filtres, ses colonnes, ses tris et ses groupes.

Filtres

Une base sans filtre contient tous les fichiers du coffre, pièces jointes comprises : il n’existe pas de from ou de source comme en SQL ou dans Dataview.

  • Deux niveaux. Les filters globaux et les filters d’une vue s’appliquent ensemble : pour une vue, ils sont combinés par un ET.
  • Trois conjonctions. and : toutes les conditions sont vraies ; or : au moins une est vraie ; not : le fichier est exclu dès qu’une des conditions du groupe est vraie. Les groupes s’imbriquent.
  • Une condition est une chaîne qui vaut vrai ou faux pour un fichier : une comparaison (status == "open") ou une fonction (file.inFolder("Contacts")). La section peut aussi contenir une seule condition, sans conjonction.
  • Mêmes règles que les formules. Les filtres acceptent les mêmes opérateurs et les mêmes fonctions.
  • Éditeur avancé. Le bouton de code d’une ligne du menu Filtre affiche la syntaxe brute et accepte les expressions que l’interface ne sait pas représenter. Depuis Obsidian 1.15 (2 novembre 2026), les filtres se réordonnent par glisser-déposer, avec la poignée à gauche de chaque ligne, et passent de la même façon de « Toutes les vues » à « Cette vue ». Dans l’interface française, les opérateurs restent en anglais (« in folder », « has tag », « is », « links to »).
Menu Filtre d’une base Obsidian ouvert sur un tableau de livres : section « Toutes les vues » avec deux conditions, file.inFolder("Tests Bases/Captures/Livres") et extension is md, puis section « Cette vue » avec une ligne fichier links to vide.
Le menu Filtre : « Toutes les vues » et « Cette vue », chacune avec sa conjonction. La première condition est en mode code (file.inFolder(…)), la deuxième dans l’interface (extension, is, md).Capture Optimike, coffre de test Margelle, thème Le bord (Margelle 1.3.0), Windows 11, Obsidian 1.15.0, 9 novembre 2026
filters:
  and:
    - file.inFolder("Projets")
    - file.ext == "md"
    - 'status != "done"'
    - file.mtime > now() - "30d"
    - '!file.hasTag("archive")'

Guillemets YAML : une condition qui commence par ! doit être entre guillemets, sinon YAML l’interprète comme un tag YAML. Mettez aussi entre guillemets les conditions qui contiennent : ou commencent par un caractère réservé ([, {, &, *). Pour un texte dans une condition, alternez les guillemets : 'status != "done"'.

Opérateurs

FamilleOpérateursExemple
Arithmétiques+ - * / % ( )(price / age).toFixed(2)
Comparaison== != > < >= <=priority >= 4
Booléens! && ||!(status == "done")

== et != comparent n’importe quel type de valeur ; les autres comparaisons portent sur des nombres ou des dates. Le + concatène aussi deux listes (Obsidian 1.9.8).

Dates et durées

On ajoute ou retire une durée à une date avec + ou - et une chaîne : file.mtime > now() - "1 week", today() + "7d", date("2024-12-01") + "1M" + "4h" + "3m".

UnitéÉcritures acceptées
annéey, year, years
moisM, month, months
semainew, week, weeks
jourd, day, days
heureh, hour, hours
minutem, minute, minutes
secondes, second, seconds
  • now() donne la date et l’heure ; today() la date à minuit.
  • Soustraire deux dates donne une durée (note.release_date - today()). La documentation a retiré, le 23 octobre 2026, l’ancienne mention d’une différence en millisecondes. Une formule du type (now() - file.ctime) / 86400000 ne correspond donc plus à la documentation : dans Obsidian 1.15.0, ((now() - file.ctime) / 86400000).toFixed(0) affiche l’erreur « Impossible de trouver la fonction “toFixed” sur le type Duration ».
  • Pour un nombre de jours, passez par number(), qui renvoie une date en millisecondes depuis l’époque Unix : ((number(now()) - number(file.ctime)) / 86400000).floor(). Testée le 9 novembre 2026, cette formule renvoie 30 pour une note créée le 10 octobre 2026 à 12 h.
Panneau « Modifier jours_depuis_fin » d’une base Obsidian : la formule if(fini_le, ((number(now()) - number(fini_le)) / 86400000).floor() + " jours", "") suivie du message Valid formula ; à gauche, la colonne jours_depuis_fin affiche 38, 87 et 141 jours pour trois livres.
Une formule de jours écoulés fondée sur number() ; Obsidian affiche « Valid formula » sous l’expression, et la colonne calcule 38, 87 et 141 jours.Capture Optimike, coffre de test Margelle, thème Le bord (Margelle 1.3.0), Windows 11, Obsidian 1.15.0, 9 novembre 2026
  • Pour un affichage lisible, file.ctime.relative() renvoie une durée écrite dans la langue de l’interface, comme « il y a 7 minutes » (« 3 days ago » en anglais).
  • duration("1d") n’est nécessaire que pour calculer sur des durées : now() + (duration("1d") * 2). La durée doit être à gauche : duration("5h") * 2 affiche « 10 heures », alors que 2 * duration("5h") affiche l’erreur « Invalid operator between Number and Duration ».

Propriétés : note, file, formula et this

  • Propriétés de note : celles du frontmatter des fichiers Markdown. note.auteur, note["auteur"] ou simplement auteur (sans préfixe, Bases suppose une propriété de note).
  • Propriétés de fichier : disponibles pour tous les types de fichiers, pièces jointes comprises.
  • Propriétés de formule : formula.nom, définies dans la section formulas.
Propriété de fichierTypeContenu
file.nametextenom du fichier
file.basenametextenom sans l’extension
file.pathtextechemin depuis la racine du coffre
file.foldertextechemin du dossier parent
file.exttexteextension
file.sizenombretaille en octets
file.ctime / file.mtimedatecréation / dernière modification
file.tagslistetags du contenu et du frontmatter
file.linkslisteliens internes de la note, frontmatter compris
file.embedslisteintégrations de la note
file.backlinkslistefichiers qui pointent vers la note ; coûteux, et non rafraîchi automatiquement quand le coffre change
file.propertiesobjettoutes les propriétés ; non rafraîchi automatiquement quand le coffre change
file.filefichierobjet fichier, réservé à certaines fonctions

Ce que désigne this

Où est la basethis désigne
ouverte dans la zone principalele fichier .base lui-même (this.file.folder = son dossier)
intégrée dans une note ou un canevasla note ou le canevas qui l’intègre
dans la barre latéralela note active de la zone principale

En barre latérale, file.hasLink(this.file) reproduit le volet des rétroliens ; la forme courte file.hasLink(this) donne le même résultat dans Obsidian 1.15.0. Un lien se compare à un fichier : author == this est vrai si author pointe vers la note courante, et authors.contains(this) cherche dans une liste de liens.

Fonctions par type

Les fonctions de Bases suivent le comportement de JavaScript. Hors fonctions globales, elles s’appellent sur une valeur : file.name.lower(), tags.contains("urgent"). Pour appeler une fonction sur un nombre écrit en dur, entourez-le de parenthèses : (2.5).round().

Globales

FonctionRôle
if(condition, siVrai, siFaux?)renvoie siVrai si la condition est vraie, sinon siFaux (ou null)
now() / today()date et heure actuelles / date du jour à minuit
date("AAAA-MM-JJ HH:mm:ss")convertit un texte en date
duration("1d")convertit un texte en durée
number(valeur)convertit en nombre ; une date devient des millisecondes, un booléen 1 ou 0
list(valeur)renvoie une liste ; utile pour une propriété tantôt simple, tantôt liste
link(chemin, affichage?)crée un lien (ou une URL si le chemin en est une)
file(chemin)renvoie l’objet fichier d’un chemin ou d’un lien
image(chemin)affiche une image dans la vue
icon("arrow-right")affiche une icône Lucide
html(texte) / escapeHTML(texte)rend du HTML / échappe les caractères HTML
max(a, b, …) / min(a, b, …)plus grand / plus petit nombre
random()nombre entre 0 et 1, recalculé au chargement de la vue

Toute valeur

isTruthy() (valeur convertie en booléen), isType("string") (vérifie le type), toString().

Date

Champs : year, month (1 à 12), day, hour, minute, second, millisecond. Fonctions : date() (retire l’heure), format("YYYY-MM-DD") (format Moment.js), time() (heure en texte), relative() (« il y a 7 minutes » en français), isEmpty() (toujours faux).

Texte

Champ : length. Fonctions : contains(), containsAll(), containsAny(), startsWith(), endsWith(), isEmpty(), lower(), title(), trim(), replace(motif, remplacement) (un texte remplace toutes les occurrences ; une expression régulière suit son drapeau g et accepte $1, $2), repeat(n), reverse(), slice(début, fin?), split(séparateur, n?).

Nombre

abs(), ceil(), floor(), round(décimales?), toFixed(décimales) (renvoie un texte), isEmpty().

Liste

Champ : length. Fonctions : contains(), containsAll(), containsAny(), isEmpty(), join(séparateur), filter(condition), map(expression), reduce(expression, valeurInitiale), flat(), reverse(), slice(), sort(), unique(). Dans filter, map et reduce, value désigne l’élément courant, index sa position et acc le cumul : [1,2,3].reduce(acc + value, 0) renvoie 6.

Lien, URL, fichier

  • Lien : asFile() (le fichier visé, s’il existe), linksTo(fichier).
  • URL : les fonctions de texte, pas celles des liens.
  • Fichier : asLink(affichage?), hasLink(autreFichier), hasProperty("nom"), hasTag("a", "b") (vrai si l’un des tags est présent, tags imbriqués compris ; insensible à la casse depuis 1.9.14), inFolder("dossier") (sous-dossiers compris ; le chemin part de la racine du coffre : file.inFolder("Required Reading") ne trouve pas Projets/Required Reading, il faut écrire file.inFolder("Projets/Required Reading")).

Objet et expression régulière

  • Objet (par exemple file.properties) : isEmpty(), keys(), values().
  • Expression régulière : /abc/.matches("abcde").

La liste officielle, avec la signature de chaque fonction, est dans la documentation des fonctions.

Formules

Une formule se crée depuis le menu Propriétés (« Add formula » dans la documentation) ; d’après la documentation, l’éditeur complète les noms de fonctions et de propriétés. Il affiche « Valid formula » (en anglais) quand l’expression est valide. Dans le YAML :

formulas:
  en_retard: 'if(due_date < now() && status != "Done", "En retard", "")'
  score: "(impact * urgency) / effort"
  echeance: 'start_date + "2w"'
  nb_taches: "tasks.length"
  • Une formule est toujours écrite comme un texte dans le YAML ; son type réel dépend du résultat. toFixed() renvoie un texte : pour trier numériquement, gardez une formule numérique à part ((price / age).round(2)).
  • Les textes littéraux demandent des guillemets imbriqués : 'if(price, price.toFixed(2) + " €")'.
  • Une formule peut utiliser formula.autre, sans référence circulaire, directe ou indirecte.

Lire les propriétés d’une note liée

Documenté depuis le 5 novembre 2026. Une propriété qui contient un lien, comme project: "[[Refonte du site]]", devient un fichier avec asFile(), dont on lit les propriétés :

formulas:
  statut_projet: "project.asFile().properties.status"
  statut_projet_sur: "list(project)[0].asFile().properties.status"
  heures_total: "tasks.map(value.asFile().properties.hours).reduce(acc + value, 0)"
  taches_ouvertes: 'tasks.filter(value.asFile().properties.status != "Done").length'
  statuts_uniques: "tasks.map(value.asFile().properties.status).unique()"
  heures_retroliens: "file.backlinks.map(value.asFile().properties.hours).reduce(acc + value, 0)"

La documentation prévient : ces résultats se mettent à jour quand la note de la ligne change ; si vous ne modifiez que la note liée, ils peuvent rester anciens jusqu’à la réouverture de la base. La dernière forme, fondée sur file.backlinks, est lente sur un grand coffre : mieux vaut stocker les liens dans la note elle-même.

Résumés

Un résumé calcule une valeur sur une colonne, pour les lignes visibles de la vue. Dans l’interface : clic droit sur l’en-tête de colonne d’un tableau → « Résumer… » (les noms des calculs restent en anglais). Le résultat s’affiche en bas de colonne et, si la vue est groupée, en tête de chaque groupe.

RésuméType d’entréeRésultat
Average, Median, Stddevnombremoyenne, médiane, écart type
Min, Max, Sum, Rangenombreplus petit, plus grand, somme, écart max − min
Earliest, Latest, Rangedateplus ancienne, plus récente, écart
Checked, Uncheckedcase à cochernombre de vrais, de faux
Empty, Filled, Uniquetout typevaleurs vides, remplies, distinctes

Un résumé personnalisé est une formule sur values, la liste des valeurs de la colonne, et doit renvoyer une seule valeur. On le déclare dans la section summaries de la base, puis on l’attribue à une colonne dans la clé summaries de la vue :

summaries:
  total_arrondi: "values.reduce(acc + value, 0).round(1)"
views:
  - type: table
    name: Heures
    summaries:
      hours: total_arrondi
      file.name: Filled

Clés d’une vue

CléRôleSource
typetable, list, cards, kanban, map (avec le plugin Maps) ou un type ajouté par un plugindocumentation
namenom affiché ; sert à viser la vue dans ![[Nom.base#Nom]]documentation
filtersfiltres propres à la vuedocumentation
ordercolonnes affichées et leur ordre ; ne trie pas les lignesdocumentation
limitnombre maximal de lignes (le menu Résultats fait la même chose : « Limiter le nombre de résultats »)documentation
groupByproperty et direction (ASC ou DESC)documentation
groupOrdergroupes affichés, dans cet ordre ; null pour les fichiers sans valeur (groupe « Aucun » ; l’interface écrit un élément vide) ; un groupe absent de la liste est masqué ; une liste vide masque tous les groupesdocumentation ; testé dans Obsidian 1.15.0
summariesrésumé attribué à chaque colonnedocumentation
sortliste de tris, chacun avec property et directionécrite par Obsidian (Trier → « Ajouter un tri ») ; une sort écrite à la main est appliquée et reprise dans le menu Trier (testé dans Obsidian 1.15.0) ; non décrite dans la page de syntaxe
views:
  - type: kanban
    name: Projets
    groupBy:
      property: note.status
      direction: ASC
    groupOrder:
      - Planifié
      - En cours
      - Fait
      - null
    sort:
      - property: file.mtime
        direction: DESC

Chaque mise en page enregistre aussi ses propres réglages dans la vue (image des cartes, hauteur de ligne, marqueurs de liste…). Ils se règlent dans l’interface ; les clés observées sont listées dans Vues et propriétés, qui détaille aussi le choix et le réglage de chaque vue.

Pièges fréquents

  • Références circulaires entre formules : A peut utiliser B, mais B ne peut pas utiliser A.
  • file.backlinks sur un grand coffre : évitez-le. Inversez la recherche avec file.links, ou file.hasLink(this.file) en barre latérale, et réduisez le nombre de lignes avec limit.
  • Guillemets YAML : entourez les conditions qui commencent par ! et alternez simples et doubles guillemets autour des textes.
  • Types hétérogènes : une propriété tantôt texte, tantôt liste fausse les filtres. list(valeur) uniformise ; mieux vaut corriger les notes.
  • Opérateur « exists » : supprimé en 1.9.8 ; utilisez file.hasProperty("nom").
  • toFixed() puis tri : le résultat est un texte. Dans Obsidian 1.15.0, un tri sur « 5.00 », « 9.00 » et « 10.00 » suit pourtant l’ordre numérique ; d’autres formats de texte n’ont pas été testés. Pour trier, gardez une formule numérique (round(2)).
  • Âge en millisecondes : la soustraction de deux dates donne une durée ; passez par number() (voir « Dates et durées »).

FAQ Bases

Puis-je trier sur une formule ?

Oui : choisissez la formule dans le menu Trier de la vue, puis sa direction. order organise les colonnes et ne suffit pas à trier les résultats.

Comment limiter les résultats ?

Avec le menu Résultats de la vue (« Limiter le nombre de résultats »), ou la clé limit (par exemple limit: 50).

Comment filtrer par période ?

file.mtime > now() - "7d" pour les sept derniers jours ; today() pour comparer des dates sans heure.

Un bloc base peut-il remplacer un fichier .base ?

Oui : collez la même syntaxe YAML dans le bloc. Le fichier reste préférable si plusieurs notes intègrent la même base.

Comment repérer les notes sans une propriété ?

'!file.hasProperty("statut")', ou groupOrder avec null dans un kanban groupé par cette propriété.

Un exemple minimal à vérifier sur copie

Dans un coffre d’essai séparé, créez le dossier Bases-essai avec une note status: open et une note status: done. Ajoutez une troisième note status: open hors de ce dossier. Les valeurs sont des propriétés de texte dans le frontmatter. Cet exemple doit afficher uniquement la note ouverte du dossier ; les deux autres servent de témoins négatifs.

filters:
  and:
    - file.inFolder("Bases-essai")
    - file.ext == "md"
views:
  - type: table
    name: "À reprendre"
    filters:
      and:
        - note.status == "open"
    order:
      - file.name
      - note.status

Copiez ce YAML dans un fichier .base ou dans un bloc base d’une note. Cet extrait a été testé le 9 novembre 2026 dans Obsidian 1.15.0 (Windows 11), avec le dossier placé dans un sous-dossier du coffre d’essai et son chemin complet dans le filtre : seule la note ouverte du dossier apparaît. Notez la version et vérifiez les résultats avant d’utiliser votre contenu réel.


Cette référence a été confrontée le 9 novembre 2026 à la syntaxe officielle de Bases, aux réglages des vues, aux fonctions documentées, à la page Formulas et au journal des versions jusqu’à Obsidian 1.15.1. La clé sort est relevée dans des fichiers .base écrits par l’application. Les exemples ont été testés le 9 novembre 2026 dans Obsidian 1.15.0 (Windows 11) ; les extraits ne constituent pas un benchmark de performance.

Chez Optimike, une vue sert à retrouver une référence ou à reprendre un travail. Gardez les règles de filtre lisibles, contrôlez une note qui doit apparaître et une note qui doit rester exclue, puis laissez la personne responsable valider ce qui fait foi.

La lettre Optimike

Ce que je teste sur Obsidian et l’IA, avant que ça devienne un guide.

Ce qui marche, ce qui casse. Vous vous désinscrivez quand vous voulez.

Votre adresse sert uniquement à l’envoi de la lettre d’Optimike. Données personnelles