convex-queries について
Convex のクエリを実装する開発者向けのガイドです。関数の定義や呼び出しに加え、ページネーション、インデックス、全文検索、性能改善の方法を扱います。
主な機能
- 01クエリ関数の定義と登録
- 02引数検証と関数呼び出し
- 03インデックスと結果の並べ替え
- 04ページネーションと全文検索
- 05クエリ性能の最適化
活用シーン
- 01Convex データベースのクエリ作成
- 02大規模な結果のページネーション
- 03インデックスによる検索の改善
- 04全文検索の設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ sstobo/ convex-skills --skill convex-queriesインストール後、Claude Code で/convex-queriesを入力して読み込まれたか確認します。
同梱ファイルreferences/query-guidelines.md
詳細
Convex クエリスキル
このスキルでは、Convex のクエリ関数の実装に関する専門的なガイダンスを提供します。関数の定義、登録、呼び出しパターン、ページネーション、インデックス、全文検索のベストプラクティスを含みます。
このスキルを使用するタイミング
次のような場合に、このスキルを使用してください:
- Convex データベースからデータを取得する新しいクエリ関数を定義するとき
- 大量の結果をページネーションで処理するとき
- 効率的なクエリのためにインデックスを設定するとき
- 全文検索機能を使用するとき
- 他の Convex 関数からクエリを呼び出すとき
- クエリのパフォーマンスを最適化するとき
スキルのリソース
このスキルには、次の内容を網羅したリファレンスドキュメント references/query-guidelines.md が含まれています:
クエリ開発の基礎
- 新しい関数構文を使用した関数定義の構文
- クエリの登録(
queryとinternalQuery) - 引数バリデーターとその使い方
- 関数の呼び出しパターン(
ctx.runQuery) - 関数参照(
apiオブジェクトとinternalオブジェクト) - クエリパスのファイルベースルーティング
クエリの最適化
- クエリのガイドライン(
filterを避け、withIndexでインデックスを使用する) .order('asc')と.order('desc')による結果の並べ替え- 単一のドキュメントを取得するための
.unique()の使用 for await構文による非同期反復処理- クエリの上限とパフォーマンスに関する考慮事項
高度なクエリ機能
- ページネーション:
paginationOptsValidatorを使用したページネーション付きクエリの実装paginationOpts(numItems と cursor)の理解- ページネーションされた結果の読み取り(page、isDone、continueCursor)
- 全文検索:検索インデックスの設定とクエリ
- インデックス作成:効率的な検索のためのインデックスの作成と使用
- 組み込みインデックス(by_id、by_creation_time)
- カスタムのインデックス名とフィールドの順序
- 複数のインデックスを使ったネストされたクエリ
データベースクエリ
ctx.db.query()による Convex データベースからの読み取り.withIndex()によるインデックスの使用.collect()と.take(n)による結果の収集
このスキルの使用方法
- リファレンスドキュメント
references/query-guidelines.mdを読み、クエリのパターンをすべて理解します - 構文の例に従い、適切なバリデーターを使ってクエリ関数を定義します
filterメソッドの代わりにインデックスを使用して、効率的にフィルタリングします- 大規模なデータセットを扱う場合は、ページネーションを実装します
- テキストに基づくフィルタリングが必要な場合は、全文検索を活用します
- Convex が結果をどのように並べ替えるかを理解し、順序を最適化します
クエリの主なガイドライン
- すべてのクエリ関数には、必ず引数バリデーターを含めてください
- クエリで
filterを使用しないでください。代わりにwithIndexを使用してください - ミューテーションやアクションからクエリを呼び出すには、
ctx.runQueryを使用してください - 同じファイル内でクエリを呼び出す場合は、戻り値の型注釈を指定してください(TypeScript の循環参照を回避する方法です)
- クエリの実行時間は最大 1 秒で、最大 16384 件のドキュメントを読み取れます
- クエリに明示的な戻り値がない場合、暗黙的に
nullを返します
例:インデックスを使った基本的なクエリ
import { query } from "./_generated/server";
import { v } from "convex/values";
export const getMessagesByChannel = query({
args: {
channelId: v.id("channels"),
},
handler: async (ctx, args) => {
return await ctx.db
.query("messages")
.withIndex("by_channel", (q) => q.eq("channelId", args.channelId))
.order("desc")
.take(20);
},
});
詳しい情報やその他のパターンについては、リファレンスドキュメント全文を参照してください。
コメント
Markdown 対応