2012-11-27 39 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 总结它:您需要使用不同的文档类型,然后使用单个视图来整理结果。