Когда вы [[Создание базы|создаёте базу]] в Obsidian, она сохраняется как файл `.base`. Обычно базы редактируются через интерфейс приложения, но синтаксис также можно редактировать вручную и встраивать в блок кода. Синтаксис [[Введение в Базы|Баз]] определяет [[Виды|виды]], фильтры и [[Формулы|формулы]]. Базы должны представлять собой валидный YAML, соответствующий схеме, описанной ниже. ## Пример Вот пример файла базы. Далее мы подробно разберём каждый раздел. ```yaml 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) + " dollars")' ppu: "(price / age).toFixed(2)" properties: status: displayName: Status formula.formatted_price: displayName: "Price" file.ext: displayName: Extension summaries: customAverage: 'values.mean().round(3)' views: - type: table name: "My table" limit: 10 groupBy: property: note.age direction: DESC filters: and: - 'status != "done"' - or: - "formula.ppu > 5" - "price > 2.1" order: - file.name - file.ext - note.age - formula.ppu - formula.formatted_price summaries: formula.ppu: Average ``` ### Фильтры По умолчанию база включает каждый файл в хранилище. Здесь нет ключевых слов `from` или `source`, как в SQL или Dataview. Раздел `filters` позволяет задать условия для сужения набора данных. ```yaml # Простой фильтр: filters: and: - file.hasTag("tag") # Сложный фильтр: filters: or: - file.hasTag("tag") - and: - file.hasTag("book") - file.hasLink("Textbook") - not: - file.hasTag("book") - file.inFolder("Required Reading") ``` Фильтры можно применять в двух местах: 1. На глобальном уровне `filters` (показано выше) — они применяются ко всем видам в базе. 2. На уровне `view` — они применяются только к конкретному виду. Эти два раздела функционально эквивалентны, и при вычислении для вида они объединяются через `AND`. Раздел `filters` содержит либо одно выражение фильтра в виде строки, либо рекурсивно определённый объект фильтра. Объекты фильтра могут содержать один из ключей `and`, `or` или `not`. Эти ключи представляют собой гетерогенный список других объектов фильтра или строковых выражений фильтра. Выражение фильтра — это строка, которая при применении к заметке вычисляется как истинное или ложное значение. Оно может быть одним из следующих: - Базовое сравнение с использованием стандартных арифметических операторов. - Функция. Набор [[Функции|функций]] доступен по умолчанию, а плагины могут добавлять дополнительные функции. Синтаксис и доступные функции для фильтров и формул одинаковы. ### Формулы Раздел `formulas` определяет [[Формулы|свойства-формулы]], которые можно отображать во всех видах файла базы. ```yaml formulas: formatted_price: 'if(price, price.toFixed(2) + " dollars")' ppu: "(price / age).toFixed(2)" ``` Свойства-формулы поддерживают базовые арифметические операторы и набор встроенных [[Функции|функций]]. В будущем плагины смогут добавлять функции для использования в формулах. Вы можете ссылаться на свойства разными способами в зависимости от их типа: - **Свойства заметки** — это свойства, определённые в начальных метаданных заметки. Например, `note.price` или `note["price"]`. Если префикс не указан, предполагается, что это свойство заметки (`note`). - **Свойства файла** описывают сам файл. Например, `file.size` или `file.ext`. Также можно обращаться к объекту файла напрямую, например, `file.hasLink()`. - **Свойства-формулы** — это другие формулы в базе. Например, `formula.formatted_price`. Формула может использовать значения других свойств-формул, при условии отсутствия циклических ссылок. Свойства-формулы всегда хранятся как строки в YAML, но их фактический **выходной тип данных** определяется типом исходных данных и возвращаемым значением используемых функций. Обратите внимание, что вложенные кавычки необходимы для включения текстовых литералов в поле YAML. Текстовые литералы должны быть заключены в одинарные или двойные кавычки. ### Свойства Раздел `properties` позволяет хранить конфигурационную информацию о каждом свойстве. Как именно эти значения конфигурации используются, зависит от конкретного вида. Например, в таблицах отображаемое имя используется для заголовков столбцов. ```yaml properties: status: displayName: Status formula.formatted_price: displayName: "Price" file.ext: displayName: Extension ``` Отображаемые имена не используются в фильтрах или формулах. ### Сводки Раздел `summaries` можно использовать для определения пользовательских формул сводки. Помимо определения формул сводки здесь, доступно несколько формул сводки по умолчанию. ```yaml summaries: customAverage: 'values.mean().round(3)' ``` В этом примере формула `customAverage` аналогична стандартной `Average`, за исключением того, что значение округляется до другого количества знаков. В формулах сводки ключевое слово `values` — это список, содержащий все значения данного свойства по всем заметкам в результирующем наборе. Формула сводки должна возвращать одно значение `Value`. Обратите внимание, что этот раздел `summaries` отличается от раздела `summaries` в конфигурации вида (описан ниже), где формулы сводки назначаются конкретным свойствам. #### Формулы сводки по умолчанию | Название | Тип входных данных | Описание | | --------- | ------------------ | ------------------------------------------------------------- | | Average | Числа | Среднее арифметическое всех чисел из входных значений. | | Min | Числа | Наименьшее число из входных значений. | | Max | Числа | Наибольшее число из входных значений. | | Sum | Числа | Сумма всех чисел из входных значений. | | Range | Числа | Разница между `Max` и `Min`. | | Median | Числа | Медиана всех чисел из входных значений. | | Stddev | Числа | Стандартное отклонение всех чисел из входных значений. | | Earliest | Дата | Самая ранняя дата из входных значений. | | Latest | Дата | Самая поздняя дата из входных значений. | | Range | Дата | Разница между `Latest` и `Earliest`. | | Checked | Логический | Количество значений `true`. | | Unchecked | Логический | Количество значений `false`. | | Empty | Любой | Количество пустых значений во входных данных. | | Filled | Любой | Количество непустых значений во входных данных. | | Unique | Любой | Количество уникальных значений во входных данных. | ### Виды Раздел `views` определяет способы отображения данных. Каждый элемент списка `views` задаёт отдельное представление одних и тех же данных, и количество различных видов не ограничено. ```yaml views: - type: table name: "My table" limit: 10 groupBy: property: note.age direction: DESC filters: and: - 'status != "done"' - or: - "formula.ppu > 5" - "price > 2.1" order: - file.name - file.ext - note.age - formula.ppu - formula.formatted_price summaries: formula.ppu: Average ``` - `type` выбирает из встроенных и добавленных плагинами типов видов. - `name` — это отображаемое имя, которое также может использоваться для определения вида по умолчанию. - `filters` работают точно так же, как описано выше, но применяются только к данному виду. - `groupBy` задаёт свойство и направление сортировки. Значение указанного свойства для каждой строки используется для распределения строк по группам. - `summaries` сопоставляет имена свойств с именованной сводкой. Сводки выполняют агрегацию свойства по всем строкам. [[Виды]] могут добавлять дополнительные данные для хранения любой информации, необходимой для поддержания состояния или корректного отображения. Однако авторам плагинов следует избегать использования ключей, уже занятых основным плагином Баз. Например, табличный вид может использовать это для ограничения количества строк или выбора столбца сортировки и её направления. Другой тип вида, такой как карта, может использовать это для указания, какое свойство заметки соответствует широте и долготе, а какое должно отображаться как заголовок метки. В будущем API позволит видам читать и записывать эти значения, что даст возможность виду создавать собственный интерфейс для конфигурации. ## Свойства В базах используются три вида свойств: 1. **Свойства заметки**, хранящиеся в начальных метаданных Markdown-файлов. 2. **Свойства файла**, доступные для всех типов файлов. 3. **Свойства-формулы**, определённые в самом файле `.base` (см. выше). ### Свойства заметки [[Свойства|Свойства заметки]] доступны только для Markdown-файлов и хранятся в YAML-метаданных каждой заметки. Обращаться к этим свойствам можно в формате `note.author` или просто `author` в качестве сокращения. ### Свойства файла Свойства файла относятся к файлу, который в данный момент проверяется или вычисляется. Свойства файла доступны для всех [[Поддерживаемые форматы файлов|типов файлов]], включая вложения. Например, фильтр `file.ext == "md"` будет истинным для всех Markdown-файлов и ложным в остальных случаях. | Свойство | Тип | Описание | | ------------- | ------ | ------------------------------------------------------------- | | `file.backlinks` | Список | Список файлов с обратными ссылками. Примечание: это свойство ресурсоёмкое. По возможности используйте обратный поиск через `file.links`. Результаты не обновляются автоматически при изменении хранилища. | | `file.ctime` | Дата | Дата создания | | `file.embeds` | Список | Список всех встраиваний в заметке | | `file.ext` | Строка | Расширение файла | | `file.file` | Файл | Объект файла, используется только в определённых функциях | | `file.folder` | Строка | Путь к папке файла | | `file.links` | Список | Список всех внутренних ссылок в заметке, включая начальные метаданные | | `file.mtime` | Дата | Дата изменения | | `file.name` | Строка | Имя файла | | `file.path` | Строка | Путь к файлу | | `file.properties` | Объект | Все свойства файла. Примечание: результаты не обновляются автоматически при изменении хранилища. | | `file.size` | Число | Размер файла | | `file.tags` | Список | Список всех тегов в содержимом файла и начальных метаданных | ### Доступ к свойствам через `this` Используйте объект `this` для доступа к свойствам файла. То, на что ссылается `this`, зависит от того, где отображается база. Когда база открыта в основной области содержимого, `this` указывает на свойства самого файла базы. Например, использование `this.file.folder` возвращает путь к папке, где расположена база. Когда база встроена в другой файл, `this` указывает на свойства _встраивающего_ файла (заметки или Canvas, содержащей базу). Например, использование `this.file.name` возвращает имя встраивающего файла, а не базы. Когда база находится в боковой панели, `this` ссылается на активный файл в основной области содержимого. Это позволяет создавать запросы на основе активного файла. Например, вы можете использовать `file.hasLink(this.file)` для воспроизведения панели обратных ссылок. ## Операторы ### Арифметические операторы Арифметические операторы выполняют арифметические действия над числами. Например, `radius * (2 * 3.14)`. | Оператор | Описание | | -------- | ----------- | | `+` | сложение | | `-` | вычитание | | `*` | умножение | | `/` | деление | | `%` | остаток | | `( )` | скобки | ### Арифметика с датами Даты можно изменять путём сложения и вычитания длительностей. Единицы длительности принимают различные форматы: | Единица | Длительность | | ------------------------ | ------------ | | `y`, `year`, `years` | год | | `M`, `month`, `months` | месяц | | `d`, `day`, `days` | день | | `w`, `week`, `weeks` | неделя | | `h`, `hour`, `hours` | час | | `m`, `minute`, `minutes` | минута | | `s`, `second`, `seconds` | секунда | Для изменения или смещения объектов Date используйте оператор `+` или `-` со строкой длительности. Например, `date + "1M"` добавляет 1 месяц к дате, а `date - "2h"` вычитает 2 часа из даты. Глобальная [[Функции|функция]] `today()` может использоваться для получения текущей даты, а `now()` — для получения текущих даты и времени. - `now() + "1 day"` возвращает дату и время ровно через 24 часа от момента выполнения. - `file.mtime > now() - "1 week"` возвращает `true`, если файл был изменён в течение последней недели. - `date("2024-12-01") + "1M" + "4h" + "3m"` возвращает объект Date, представляющий `2025-01-01 04:03:00`. - Вычитание двух дат даёт разницу в миллисекундах между ними, например, `now() - file.ctime`. - Чтобы получить только дату из Date с временем, используйте `datetime.date()`. - Для форматирования объекта Date используйте функцию `format()`, например `datetime.format("YYYY-MM-DD")`. ### Операторы сравнения Операторы сравнения можно использовать для сравнения чисел или объектов Date. Операторы равенства и неравенства можно использовать с любым типом значений, не только с числами и датами. | Оператор | Описание | | -------- | --------------------- | | `==` | равно | | `!=` | не равно | | `>` | больше | | `<` | меньше | | `>=` | больше или равно | | `<=` | меньше или равно | ### Логические операторы Логические операторы можно использовать для объединения или инвертирования логических значений, результатом чего является истинное или ложное значение. | Оператор | Описание | | -------- | -------------- | | `!` | логическое НЕ | | `&&` | логическое И | | \|\| | логическое ИЛИ | ## Функции Смотрите [[Функции|список функций]], которые можно использовать в формулах и [[Виды|фильтрах]]. ## Типы Базы имеют систему типов, которая используется формулами и фильтрами для применения функций к свойствам. ### Строки, числа и логические значения Строки, числа и логические значения — это «примитивные» значения, для создания которых не требуется функция. - Строки заключаются в одинарные или двойные кавычки, например `"message"`. - Числа записываются цифрами и при необходимости могут быть заключены в скобки для наглядности. Например, `1` или `(2.5)`. - Логические значения записываются как `true` или `false` без кавычек. ### Даты и длительности Даты представляют конкретную дату или дату и время — в зависимости от функции, используемой для их создания, или типа, назначенного [[Свойства|свойству]]. - Для создания даты используйте функцию `date`, например `date("2025-01-01 12:00:00")`. - Для изменения даты добавьте или вычтите длительность, например `now() + "1 hour"` или `today() + "7d"`. - Сравнивайте даты с помощью операторов сравнения (например, `>` или `<`) и арифметических операторов (например, `(now() + "1d") - now()` возвращает `86400000` миллисекунд). - Для извлечения частей даты используйте доступные поля (`now().hour`) или вспомогательные функции (`now.time()`). - Множество других [[Функции|полей и функций]] доступно для объектов дат. ### Объекты и списки - Превратите одиночный элемент в список с помощью функции `list()`. Это особенно полезно для свойств, которые могут содержать как списки, так и одиночные значения. - Обращайтесь к элементам списка с помощью квадратных скобок и индекса, начинающегося с 0. Например, `property[0]` возвращает первый элемент списка. - Обращайтесь к элементам объекта с помощью квадратных скобок и имени элемента или точечной нотации. Например, `property.subprop` или `property["subprop"]`. ### Файлы и ссылки [[Связывание заметок|Wiki-ссылки]] в [[Свойства|начальных метаданных]] автоматически распознаются как объекты Link. Ссылки отображаются как кликабельные ссылки в [[Виды|виде]]. - Для создания ссылки используйте глобальную [[Функции|функцию]] `link`, например `link("filename")` или `link("https://obsidian.md")`. - Вы можете создать ссылку из любой строки, например, `link(file.ctime.date().toString())`. - Для установки отображаемого текста передайте необязательную строку или значок вторым параметром, например `link("filename", "display")` или `link("filename", icon("plus"))`. Объект File можно превратить в ссылку с помощью `file.asLink()` с необязательным отображаемым текстом. Ссылки можно сравнивать с помощью `==` и `!=`. Они считаются эквивалентными, если указывают на один и тот же файл, или, если файл не существует при поиске, их текст ссылки должен быть идентичным. Ссылки можно сравнивать с файлами, такими как `file` или `this`. Они будут равны, если ссылка разрешается в данный файл. Например, `author == this`. Ссылки также можно проверять на вхождение в список, например, `authors.contains(this)`.