0

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

4

3 回答 3

0

让员工和经理列出不同的文档集是使用关系结构,而您的数据库不是关系。如果由于某种原因,您被迫这样做,则需要某种方法来区分 doc 的方案(它来自哪个表)。假设您正在使用 field 进行操作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],并且每个经理前面都有标记为经理(键[..., 0])的行。这将需要一些空间,但使用列表功能,您可以轻松过滤掉经理,客户端将仅从数据库接收非经理。

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

于 2012-11-27T10:37:28.730 回答
0

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

于 2012-11-27T10:34:56.933 回答
0

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

于 2012-11-27T13:01:25.090 回答