---
share_link: https://share.note.sx/i2hmpb4g#q/Lf5iG+LxId4Ylsaq7Pkwz5M86cSSrHTEFxhwFOYzg
share_updated: 2024-09-07T15:33:58+06:00
---
Dataview в Obsidian — это мощный плагин, который позволяет создавать динамические представления данных, хранящихся в заметках. Он предназначен для пользователей, которые хотят организовать и визуализировать свои заметки более эффективно, используя специальные запросы.
 

**Основные возможности Dataview:**

1. **Фильтрация и сортировка заметок:** Вы можете создавать запросы, которые будут фильтровать заметки по определенным критериям (например, по тегам, дате, содержимому и т.д.) и сортировать их.
2. **Таблицы:** Вывод заметок в виде таблиц, где каждая строка представляет собой заметку, а столбцы могут содержать различные атрибуты заметок (например, дата создания, теги, пользовательские поля).
3. **Списки:** Создание списков заметок, соответствующих заданным условиям.
4. **Календари:** Визуализация заметок в виде календаря, что особенно полезно для управления задачами и планированием.
5. **Графики и диаграммы:** Создание простых графиков для визуализации данных из заметок.

На словах вроде все красиво и нарядно, но вот на практике - использование Dataview это одно из тех редких исключений, когда вам все-таки придется поднапрячься для написания запросов. Причем запросы можно писать как на SQL-like языке (что по сути и не программирование), так и на DataciewJS (а вот тут уже полноценный кодинг).

Но дам вам небольшой лайфхак - с помощью модных AI-шарманок такие запросы составляются вообще за пять секунд, главное подробно указать в запросе, что вам надо. 

Вот пример подобного запроса (можно озадачить хоть ChatGPT, хоть Claude, хоть Gemini):

```
Напиши код запроса Dataview для решения следующей задачи:
- Вывести в таблице список всех заметок, имеющих тег project
- Исключи из выдачи заметки из папки Архив
- Отсортируй заметки от самых свежих к самым старым
- Если заметок много - поставь лимит отображения в 10 заметок
```

В результате получите вполне рабочий запрос, который работает даже без доработки напильником (чтобы проверить - слово dataview перенесите на первую строчку сразу после бэктиков, т.е. первая строка у вас должна выглядеть как ````dataview`

```
dataview
table file.mtime as "Дата изменения", file.ctime as "Дата создания"
from #project
where !contains(file.path, "Архив")
sort file.ctime desc
limit 10
```

Главное - понять принцип построения таких запросов. Как только разберетесь и напишите штук 5-10 таких кусков кода, дальше будет намного проще. Кстати - есть еще одна штука, которая здорово облегчает на первых порах знакомство с инструментом - [онлайн-редактор](https://s-blu.github.io/basic-dataview-query-builder/). Просто по шагам указываете что вам надо и в каком виде, на выходе получаете готовый запрос. 

В общем - Dataview только выглядит страшно на первый взгляд, а в целом - если есть желание, вы вполне его освоите за пару недель. Удачи 🤝

### Примеры запросов Dataview
> [!Map]- Список заметок, которые еще не созданы, и на которые есть как минимум 2 ссылки в нашей базе знаний
> ```dataviewjs
> const count = 2;
> let d = {};
> function process(k, v) {
>   Object.keys(v).forEach(function (x) {
>     x = dv.fileLink(x);
>     if (d[x]==undefined) { d[x] = []; }
>     d[x].push(dv.fileLink(k));
>   });
> }
> 
> Object.entries(dv.app.metadataCache.unresolvedLinks)
>     .filter(([k,v])=>Object.keys(v).length)
>     .forEach(([k,v]) => process(k, v));
>     
> dv.table(["Имя заметки", "Ссылаются"],
>          Object.entries(d)
>          .filter(([k, v]) => v.length >= count)
>          .sort((a, b) => b[1].length - a[1].length)
>          .map(([k,v])=> [k, v.join(" • ")]))
> ```

> [!Globe]- Подсчет количество прожитых дней
> В коде необходимо задать свою дату рождения и предполагаемую длительность жизни. Да, жестковато, но куда деваться 🙂
 > 
 > ```dataviewjs
 // Задайте дату рождения и продолжительность жизни
 > const birthDate = new Date("1990-01-01"); // Замените на вашу дату рождения
 > const expectedLifespan = 100; // Ожидаемая продолжительность жизни в годах
 > 
 > // Текущая дата
 > const currentDate = new Date();
 > 
 > // Рассчитайте дату конца жизни
 > const deathDate = new Date(birthDate);
 > deathDate.setFullYear(birthDate.getFullYear() + expectedLifespan);
 > 
 > // Рассчитайте количество прожитых дней и оставшихся дней
 > const livedDays = Math.floor((currentDate - birthDate) / (1000 * 60 * 60 * 24));
 > const totalDays = Math.floor((deathDate - birthDate) / (1000 * 60 * 60 * 24));
 > const remainingDays = totalDays - livedDays;
 > const percentageLived = (livedDays / totalDays) * 100;
 > 
 > // Вывод информации
 > dv.paragraph(`**Ты прожил ${livedDays} дней. Это ${percentageLived.toFixed(2)}% от твоей жизни. У тебя осталось ${remainingDays} дней. Используй оставшееся время с пользой.**`);
 > ```

> [!Radar]- Список входящих и исходящих ссылок из текущей заметки
> ```dataview 
> TABLE without id 
> map(file.outlinks, (link) => "[[" + meta(link).path + "]]") AS "Исходящие",
> map(file.inlinks, (link) => "[[" + meta(link).path + "]]") AS "Входящие" 
> WHERE file.name = this.file.name
> ```




P.S. Кстати - в канале PRO Obsidian время от времени выкладываю примеры запросов под всякие рабочие сценарии и кейсы, приходите и посмотрите. Ну или поделитесь своим, в нашем комьюнити это особо приветствуется. 


