関連の照会は、物理的なテーブル名を手で組み立てるのではなく、宣言されたメタデータを通じて関連するレコードを読み取ります。各リレーションには、メタデータと、選択したデータを読み取る権限が必要です。
ルートとリレーションの選択
ここでは 顧客と注文のリレーション を使います。
const customers = await db.repository('customers').findMany({
select: (s) => s.fields('id', 'name').include('orders', (orders) =>
orders.fields('id', 'title', 'amount')
.filter({ status: 'draft' })
.sort((s) => s.field('id').asc())
.limit(10)),
sort: (s) => s.field('id').asc(),
limit: 20,
});ルートは最大 20 人の顧客を返し、それぞれに最大 10 件の下書きの注文が付きます。リレーションのローカルなフィルターは注文を変えるだけで、ルートの顧客の集合は変えません。リレーションで顧客を絞り込むには、ルートのリレーションの条件が必要です。
結果の形
| リレーション | 一致なし | 一致あり |
|---|---|---|
| belongsTo / hasOne | null | オブジェクト |
| hasMany / belongsToMany | [] | 配列 |
select がない場合、スカラーのフィールドは読み取られますが、リレーションは展開されません。空の fields() は、ルートのスカラーを明示的に何も選ばないことを意味し、fields を省略すると既定のスカラーが残ります。同じリレーションを重複して include すると失敗します。
ローカルな条件と統計
対多のリレーションは、ローカルな並べ替え、件数の上限、カーソルに対応しています。対一はページネーションや集計に対応していません。リレーションのビルダーはイミュータブルです。チェーンの結果を捨てずに返してください。
combine() は、独立したレコード、件数、合計の分岐を返します。レコードの分岐の上限が、別の統計の分岐を自動で制限することはありません。
コストとアクセス
リレーションは分岐ごとにまとめて読み込まれますが、ローカルな上限があっても、データベースが親ごとにその件数だけを読み取るとは限りません。深いリレーションや大きなリレーションでは、照会の回数、メモリ、ペイロードのサイズを評価してください。
フィールドを選び、ポリシーを明示的に結び付けてください。リレーションが対象のアクセスルールを回避することはなく、複数の分岐が自動で同じスナップショットを共有するわけでもありません。トランザクション と 集計 を参照してください。