0

プロジェクトでCouchDBを使用する準備をしています。しかし、SQLのようなビューを実装する方法を見つけることができませんSELECT * FROM Employees WHERE LastName NOT IN (SELECT LastName FROM Managers)。言い換えると、ビューAからセットを取得したいのですが、ビューBにはありません。質問:CouchDBでnot-in条件を実装するにはどうすればよいですか?

4

3 に答える 3

0

モデルをドキュメント指向データベースに合うように変更すると、これは簡単です。私は通常、さまざまな種類のドキュメントをまっすぐに保つために、すべてのドキュメントに「タイプ」キーを保持しています。単一の「個人」タイプがあり、「管理者」でもあるすべての「個人」ドキュメントを別のキーで装飾する場合、管理者以外の担当者に対してのみビューキーを簡単に発行できます。別の「マネージャー」タイプを選択した場合は、同様に、発行されたビューキーを非マネージャーのみに制限できます。

于 2012-11-27T10:34:56.933 に答える
0

従業員とマネージャーが異なるドキュメントのセットをリストすることは、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設計を行わない場合の回避策にすぎないことに注意してください。

于 2012-11-27T10:37:28.730 に答える
0

答えは単純だと思います。ビューの結果を混在させることはできません。ビューは独立しています。ただし、おそらく問題を解決するビュー照合と呼ばれる戦略があります。これを読むことをお勧めします:http ://wiki.apache.org/couchdb/View_collat ​​ion要約すると:さまざまなドキュメントタイプを使用してから、単一のビューを使用して結果を照合する必要があります。

于 2012-11-27T13:01:25.090 に答える