2012-11-27 42 views
0

我準備將CouchDB用於我的項目。但無法找到實現像SQL SELECT * FROM Employees WHERE LastName NOT IN (SELECT LastName FROM Managers)這樣的視圖的方法。換句話說,我想從視圖A中獲得一個集合,但不是在視圖B中。問題:如何在CouchDB中實現未進入條件?CouchDB set-difference/not-in condition

回答

0

保持員工和經理列出不同的文檔集合正在使用關係結構,其中數據庫不是關係數據庫。如果出於某種原因,你被迫這樣做,你需要一些方法來區分文檔的格式(從哪個表格)。比方說,你與現場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]員工的列表,每個經理之前與RO w標記爲經理(密鑰[..., 0])。這將需要一些空間,但是使用列表功能可以輕鬆過濾管理人員,而客戶端只會從數據庫接收非管理員。

請記住,它只是沒有做出正確的數據庫設計的解決方法。

+0

我認爲這是一個更好的解決方法。 –

0

如果您更改模型以使其適合面向文檔的數據庫,這很容易。我通常在我的所有文件中都保留一個「類型」鍵,以保持不同類型的文件直接。如果您有一個單獨的「人員」類型,並用一個單獨的密鑰來裝飾所有也是「經理」的「人員」文檔,則只能爲非管理人員發出查看密鑰。如果您選擇使用單獨的「經理」類型,則可以類似地將發出的查看密鑰限制爲僅限非管理員。

0

我想答案很簡單:你不能混合查看結果。視圖是獨立的。 但是,有一種策略稱爲視圖排序規則可能會解決您的問題。我建議閱讀以下內容:http://wiki.apache.org/couchdb/View_collation 總結它:您需要使用不同的文檔類型,然後使用單個視圖來整理結果。