Isar 개념 3 - Queries

pharmDev·2024년 12월 31일

isar

목록 보기
3/7

Isar Queries

Isar란 무엇인가요?

Isar는 Flutter 및 Dart 환경에서 사용 가능한 NoSQL 데이터베이스입니다. 매우 빠르고, 가벼우며, 오프라인 애플리케이션에서 사용하기 적합합니다.

Isar에서는 데이터를 저장하고 관리하기 위해 쿼리를 사용할 수 있습니다. 여기에서는 Isar의 쿼리를 어떻게 작성하고 사용할 수 있는지 쉽고 자세히 설명합니다.


Queries (쿼리)

Isar에서 데이터를 검색하거나 필터링하기 위해 쿼리를 작성합니다.

기본 쿼리 작성

final books = await isar.books.filter().isPublishedEqualTo(true).findAll();

위 코드는 books 컬렉션에서 isPublished 필드가 true인 모든 데이터를 가져오는 예제입니다.

  • .filter(): 필터링 조건을 시작합니다.
  • isPublishedEqualTo(true): isPublished 필드가 true인 항목만 선택합니다.
  • .findAll(): 조건에 맞는 모든 데이터를 가져옵니다.

기본 코드 예시:

// Book 모델 정의
()
class Book {
  Id? id;
  String title;
  bool isPublished;
}

// 쿼리 사용 예시
final publishedBooks = await isar.books.filter().isPublishedEqualTo(true).findAll();
print(publishedBooks);

필터링 (Filters)

Isar의 필터링은 매우 강력하며 다양한 조건을 지원합니다.

예제

final filteredBooks = await isar.books.filter()
    .priceGreaterThan(10)
    .priceLessThan(50)
    .findAll();

위 코드는 가격이 10보다 크고 50보다 작은 모든 책을 검색합니다.

  • priceGreaterThan(10): 가격이 10보다 큰 책을 필터링합니다.
  • priceLessThan(50): 가격이 50보다 작은 책을 필터링합니다.

상세한 코드 예시:

final affordableBooks = await isar.books.filter()
    .priceGreaterThan(10) // 가격이 10보다 큰 조건
    .priceLessThan(50)   // 가격이 50보다 작은 조건
    .findAll();

for (var book in affordableBooks) {
  print('Title: ${book.title}, Price: ${book.price}');
}

복합 필터링 (Combining Filters)

여러 조건을 결합하여 더욱 세부적으로 데이터를 필터링할 수 있습니다.

조건 결합 예시:

final result = await isar.books.filter()
    .titleContains("Flutter")
    .and()
    .priceGreaterThan(20)
    .findAll();
  • titleContains("Flutter"): 제목에 "Flutter"라는 단어가 포함된 항목을 찾습니다.
  • .and(): 두 조건을 논리적으로 결합합니다.

코드 예시:

final specificBooks = await isar.books.filter()
    .titleContains("Dart")  // 제목에 'Dart' 포함
    .and()                  // 논리적 AND 조건
    .priceLessThan(30)      // 가격이 30 이하
    .findAll();

for (var book in specificBooks) {
  print('Title: ${book.title}, Price: ${book.price}');
}

정렬 (Sorting)

필터링한 데이터를 정렬할 수도 있습니다.

정렬 예시:

final sortedBooks = await isar.books.filter()
    .isPublishedEqualTo(true)
    .sortByPrice()
    .findAll();
  • .sortByPrice(): 가격을 기준으로 오름차순 정렬합니다.
  • .sortByPriceDesc(): 가격을 기준으로 내림차순 정렬합니다.

코드 예시:

final sortedBooks = await isar.books.filter()
    .isPublishedEqualTo(true) // 발행된 책만 필터링
    .sortByTitle()            // 제목 기준으로 정렬
    .findAll();

for (var book in sortedBooks) {
  print('Title: ${book.title}, Published: ${book.isPublished}');
}

집계 함수 (Aggregations)

데이터의 통계 정보를 얻기 위해 집계 함수를 사용할 수 있습니다.

예제:

final totalBooks = await isar.books.where().count();
print('Total Books: $totalBooks');
  • `.count()`: 데이터의 개수를 반환합니다. 즉, 이 경우 books 컬렉션의 모든 항목의 개수를 반환합니다.
  • .maxByPrice(): 가격이 가장 높은 항목을 반환합니다.
  • .minByPrice(): 가격이 가장 낮은 항목을 반환합니다.
  • `where()`: books 컬렉션에서 필터링 없이 모든 항목을 선택하는 기본 메서드입니다. 필터링 조건 없이 데이터를 다루고자 할 때 사용됩니다.

상세한 코드 예시:

final maxPriceBook = await isar.books.where().maxByPrice();
print('Most Expensive Book: ${maxPriceBook?.title}, Price: ${maxPriceBook?.price}');

final totalCount = await isar.books.where().count();
print('Total Books in Collection: $totalCount');

동적 쿼리 (Dynamic Queries)

조건을 동적으로 변경하여 쿼리를 생성할 수 있습니다.

예제:

final filterQuery = isar.books.filter(); // Isar에서 데이터를 검색할 쿼리 객체 생성

// isPublishedFilter가 true일 경우, 발행된 책만 필터링 조건 추가
if (isPublishedFilter) {
  filterQuery.isPublishedEqualTo(true); 
}

// maxPrice가 null이 아닐 경우, 주어진 가격보다 낮은 책만 필터링 조건 추가
if (maxPrice != null) {
  filterQuery.priceLessThan(maxPrice); 
}

// 필터 조건에 맞는 모든 책 데이터를 검색
final books = await filterQuery.findAll();
  • **isPublishedFilter**와 **maxPrice**는 동적으로 쿼리 조건을 추가할 수 있도록 합니다.

코드 예시:

bool isPublishedFilter = true;
int? maxPrice = 50;

final dynamicQuery = isar.books.filter();

if (isPublishedFilter) {
  dynamicQuery.isPublishedEqualTo(true); // 발행된 책만
}
if (maxPrice != null) {
  dynamicQuery.priceLessThan(maxPrice);  // 최대 가격 조건
}

final filteredBooks = await dynamicQuery.findAll();
for (var book in filteredBooks) {
  print('Title: ${book.title}, Price: ${book.price}, Published: ${book.isPublished}');
}

요약

  1. .filter(): 데이터를 조건에 따라 필터링합니다.
  2. .and(), .or(): 여러 조건을 결합합니다.
  3. .sortByField(): 데이터를 정렬합니다.
  4. .count(), .maxByField() 등으로 집계 정보를 얻을 수 있습니다.
  5. 동적 쿼리를 통해 상황에 따라 조건을 변경할 수 있습니다.

Isar의 쿼리는 간결하면서도 강력합니다. 코드 예제를 따라 작성하며 사용법을 익혀 보세요.

profile
코딩을 배우는 초보

0개의 댓글