CouchDB set-difference / not-in条件

时间:2012-11-27 08:47:11

标签: couchdb set-difference

我准备将CouchDB用于我的项目。但无法找到实现像SQL SELECT * FROM Employees WHERE LastName NOT IN (SELECT LastName FROM Managers)这样的视图的方法。换句话说,我想从视图A中获取一个集合但不在视图B中。问题:如何在CouchDB中实现not-in条件?

3 个答案:

答案 0 :(得分:0)

如果更改模型以使其适合面向文档的数据库,这将很容易。我通常会在所有文档中保留一个“类型”键,以保持不同类型的文档。如果您有一个“人”类型并且使用单独的键装饰所有“人”文档也是“经理”,则您可以轻松地仅为非管理人员发出视图键。如果您选择使用单独的“经理”类型,则可以类似地将发出的视图密钥限制为非管理员。

答案 1 :(得分:0)

保持员工和经理列出不同的文档集是使用关系结构,而DB不是关系型的。如果由于某种原因,你被迫这样做,你需要一些方法来区分doc的方案(从哪个表开始)。让我们说你正在使用字段scheme

{ _id: "EMPL_ID", scheme: "employee", ... }
{ _id: "MNGR_ID", scheme: "manager", employee: "EMPL_ID", ... }

然后你可以使用map:

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]的员工列表,每个经理的前面都标有为manager(密钥[..., 0])。这将需要一些空间,但使用列表功能,您可以轻松过滤掉管理员,客户端将仅从非管理员那里收到数据。

请记住,这只是没有进行正确数据库设计的解决方法。

答案 2 :(得分:0)

我认为答案很简单:你不能混合观看结果。意见是独立的。 但是,有一种名为查看整理的策略可能会解决您的问题。我建议你阅读:http://wiki.apache.org/couchdb/View_collation 总结一下:您需要使用不同的文档类型,然后使用单个视图来整理结果。