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
```
### 필터
기본적으로 베이스는 보관함의 모든 파일을 포함해요. SQL이나 Dataview처럼 `from`이나 `source`가 없어요. `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 + "1M"`은 날짜에 1개월을 더하고, `date - "2h"`는 날짜에서 2시간을 빼요.
전역 [[함수|함수]] `today()`를 사용하여 현재 날짜를 가져올 수 있고, `now()`를 사용하여 시간이 포함된 현재 날짜를 가져올 수 있어요.
- `now() + "1 day"`는 실행 시점으로부터 정확히 24시간 후의 날짜시간을 반환해요.
- `file.mtime > now() - "1 week"`는 파일이 지난 주 내에 수정되었으면 `true`를 반환해요.
- `date("2024-12-01") + "1M" + "4h" + "3m"`은 `2025-01-01 04:03:00`을 나타내는 날짜 객체를 반환해요.
- 두 날짜를 빼면 밀리초 차이를 얻을 수 있어요. 예: `now() - file.ctime`.
- 시간이 포함된 날짜의 날짜 부분만 가져오려면 `datetime.date()`를 사용해요.
- 날짜 객체를 서식 지정하려면 `format()` 함수를 사용해요. 예: `datetime.format("YYYY-MM-DD")`.
### 비교 연산자
비교 연산자는 숫자 또는 날짜 객체를 비교하는 데 사용할 수 있어요. 같음과 같지 않음은 숫자와 날짜뿐만 아니라 모든 종류의 값에 사용할 수 있어요.
| 연산자 | 설명 |
| -------- | ------------------------ |
| `==` | 같음 |
| `!=` | 같지 않음 |
| `>` | 보다 큼 |
| `<` | 보다 작음 |
| `>=` | 크거나 같음 |
| `<=` | 작거나 같음 |
### 불리언 연산자
불리언 연산자는 논리 값을 결합하거나 반전하여 참 또는 거짓 값을 생성하는 데 사용할 수 있어요.
| 연산자 | 설명 |
| -------- | ----------- |
| `!` | 논리 NOT |
| `&&` | 논리 AND |
| \|\| | 논리 OR |
## 함수
수식과 [[보기|필터]]에서 사용할 수 있는 [[함수|함수 목록]]을 참조하세요.
## 유형
베이스에는 수식과 필터가 속성에 함수를 적용하는 데 사용하는 유형 시스템이 있어요.
### 문자열, 숫자, 불리언
문자열, 숫자, 불리언은 함수 없이 생성할 수 있는 "원시" 값이에요.
- 문자열은 작은따옴표 또는 큰따옴표로 묶어요. 예: `"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"]`.
### 파일과 링크
[[노트 연결하기|위키 링크]]가 [[속성|프런트매터 속성]]에 있으면 자동으로 링크 객체로 인식돼요. 링크는 [[보기|뷰]]에서 클릭 가능한 링크로 렌더링돼요.
- 링크를 생성하려면 전역 `link` [[함수|함수]]를 사용해요. 예: `link("filename")` 또는 `link("https://obsidian.md")`.
- 모든 문자열에서 링크를 만들 수 있어요. 예: `link(file.ctime.date().toString())`.
- 표시 텍스트를 설정하려면 선택적 문자열이나 아이콘을 두 번째 매개변수로 전달해요. 예: `link("filename", "display")` 또는 `link("filename", icon("plus"))`.
파일 객체는 선택적 표시 텍스트와 함께 `file.asLink()`를 사용하여 링크로 변환할 수 있어요.
링크는 `==`와 `!=`로 비교할 수 있어요. 동일한 파일을 가리키는 한 동등하며, 조회 시 파일이 존재하지 않으면 링크 텍스트가 동일해야 해요.
링크는 `file`이나 `this`와 같은 파일과 비교할 수 있어요. 링크가 해당 파일로 해석되면 동등해요. 예: `author == this`.
링크는 목록 포함 여부도 확인할 수 있어요. 예: `authors.contains(this)`.