データの削除
単一およびバッチの delete 操作で、データベースからドキュメントまたは特定のフィールドを削除します。
delete 操作を使用する理由
データベースからレコードを削除する必要がある場合があります。ドキュメント全体の削除、複数ドキュメントの一括削除、またはドキュメント内の特定フィールドの削除などです。Squid Client SDK は、これらそれぞれのケースに対応する delete 操作を提供します。
概要
transaction 内で実行されない限り、すべての delete 操作は、サーバー上で mutation が適用されると resolve される Promise を返します。
他の mutation と同様に、delete はクライアント側で楽観的(optimistic)に適用され、その後サーバーと同期されます。optimistic update の仕組みの詳細は、データの追加 を参照してください。
コアコンセプト
Delete
ドキュメントを削除するには、document reference に対して delete メソッドを呼び出します。
const userRef = squid.collection<User>('users').doc('existing_user_id');
try {
await userRef.delete();
console.log('User deleted successfully');
} catch (error) {
console.error(`Failed to delete user ${error}`);
}
Delete many
複数のドキュメントをバッチで削除するには、collection reference に対して deleteMany メソッドを使用します。deleteMany は、ドキュメントまたはドキュメント ID の配列をパラメータとして受け取ります。
const staleDocs = await squid
.collection<User>('users')
.query()
.eq('pending-delete', true)
.snapshot();
try {
await squid.collection<User>('users').deleteMany(staleDocs);
console.log('Users successfully deleted');
} catch (error) {
console.error(`Failed to delete users ${error}`);
}
多数のドキュメントを削除する場合、deleteMany が必要とするのはドキュメント参照であり、ドキュメントの完全なデータではありません。そのため、クエリの payload サイズを削減するために field projection を使用できます。
const staleDocs = await squid
.collection<User>('users')
.query()
.eq('pending-delete', true)
.projectFields([])
.snapshot();
await squid.collection<User>('users').deleteMany(staleDocs);
Delete in path
ドキュメントの特定プロパティを削除するには、document reference に対して deleteInPath メソッドを呼び出し、削除したいプロパティへの path を渡します。path ではドット記法を使ってネストされたプロパティを指定します。
const userRef = squid.collection<User>('users').doc('existing_user_id');
try {
await userRef.deleteInPath('contact.email');
console.log('User email deleted successfully');
} catch (error) {
console.error(`Failed to delete user email ${error}`);
}
エラーハンドリング
| Error | Cause | Solution |
|---|---|---|
| Security rule rejection | delete が security rules によりブロックされた | ユーザーがコレクションに対する delete 権限を持っていることを確認する |
| Document not found | 存在しないドキュメントを削除しようとしている | ドキュメント ID が正しいことを確認する。ドキュメントがすでに削除されていないか確認する |
| Invalid path | deleteInPath に渡した path がドキュメント上に存在しない | ドット記法を用いた path がドキュメント構造と一致していることを確認する |
ベストプラクティス
-
ループで 1 件ずつ削除するのではなく、バッチ操作には
deleteMany()を使用してください。 -
特にバッチ削除では、削除前にクエリで確認し、どのドキュメントが削除されるかを把握してください。
Client codeconst toDelete = await squid
.collection<User>('users')
.query()
.eq('status', 'inactive')
.snapshot();
console.log(`Deleting ${toDelete.length} inactive users`);
await squid.collection<User>('users').deleteMany(toDelete); -
ドキュメントをきれいに保つため、optional なフィールドは
nullや空の値を設定するのではなく、deleteInPath()で削除してください。 -
すべての削除がまとめて成功または失敗することを保証したい場合は、関連する delete を transaction でラップしてください。