プロジェクトでCouchDBを使用する準備をしています。しかし、SQLのようなビューを実装する方法を見つけることができませんSELECT * FROM Employees WHERE LastName NOT IN (SELECT LastName FROM Managers)
。言い換えると、ビューAからセットを取得したいのですが、ビューBにはありません。質問:CouchDBでnot-in条件を実装するにはどうすればよいですか?
3 に答える
モデルをドキュメント指向データベースに合うように変更すると、これは簡単です。私は通常、さまざまな種類のドキュメントをまっすぐに保つために、すべてのドキュメントに「タイプ」キーを保持しています。単一の「個人」タイプがあり、「管理者」でもあるすべての「個人」ドキュメントを別のキーで装飾する場合、管理者以外の担当者に対してのみビューキーを簡単に発行できます。別の「マネージャー」タイプを選択した場合は、同様に、発行されたビューキーを非マネージャーのみに制限できます。
従業員とマネージャーが異なるドキュメントのセットをリストすることは、DBがリレーショナルではないリレーショナル構造を使用しています。何らかの理由でそれを強制された場合は、ドキュメントのスキーム(どのテーブルからのものか)を区別するための何らかの方法が必要です。あなたがフィールドでそれをやっているとしましょうscheme
:
{ _id: "EMPL_ID", scheme: "employee", ... }
{ _id: "MNGR_ID", scheme: "manager", employee: "EMPL_ID", ... }
次に、マップを使用できます。
function (doc) {
if (!doc.scheme) return;
if (doc.scheme != "manager") emit(doc.last_name, doc);
}
なんらかの奇妙な理由でそれができず、マネージャードキュメントに従業員ドキュメントへの参照しかない場合は、両方のドキュメントを発行できます。
function (doc) {
if (some_test_for_being_employee_scheme(doc))
emit([doc._id, 1], doc);
if (doc.emp_id)
emit([doc.emp_id, 0], null);
}
キーを持つ従業員のリストが["employee_id", 1]
表示され、各マネージャーの前にマネージャー(key [..., 0]
)というラベルの付いた行が表示されます。これにはある程度のスペースが必要ですが、リスト機能を使用すると、マネージャーを簡単に除外でき、クライアントはDBから非マネージャーのみを受け取ります。
これは、適切なDB設計を行わない場合の回避策にすぎないことに注意してください。
答えは単純だと思います。ビューの結果を混在させることはできません。ビューは独立しています。ただし、おそらく問題を解決するビュー照合と呼ばれる戦略があります。これを読むことをお勧めします:http ://wiki.apache.org/couchdb/View_collat ion要約すると:さまざまなドキュメントタイプを使用してから、単一のビューを使用して結果を照合する必要があります。