Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CouchDB设置差异/不在条件中_Couchdb_Set Difference - Fatal编程技术网

CouchDB设置差异/不在条件中

CouchDB设置差异/不在条件中,couchdb,set-difference,Couchdb,Set Difference,我准备在我的项目中使用CouchDB。但找不到一种方法来实现类似SQL SELECT*的视图,该视图来自LastName不在SELECT LastName FROM Manager中的员工。换言之,我想从视图a中获取一个集合,但不在视图B中。问题:如何在CouchDB中实现not In condition?如果您更改模型使其适合面向文档的数据库,这将很容易。我通常在所有文档中都保留一个类型键,以保持不同类型的文档的整洁。如果您有一个单独的人员类型,并用一个单独的键装饰所有也是经理的人员文档,那么

我准备在我的项目中使用CouchDB。但找不到一种方法来实现类似SQL SELECT*的视图,该视图来自LastName不在SELECT LastName FROM Manager中的员工。换言之,我想从视图a中获取一个集合,但不在视图B中。问题:如何在CouchDB中实现not In condition?

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

保持员工和管理器列出不同的文档集是使用关系结构,而DB不是关系结构。如果由于某种原因,您被迫这样做,那么您需要某种方法来区分文档的方案和它所在的表。假设您使用的是field scheme:

然后您可以使用地图:

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]。这将需要一些空间,但使用列表功能,您可以轻松筛选出管理者,并且客户端将仅从DB接收非管理者


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

我认为答案很简单:不能混合查看结果。观点是独立的。 然而,有一种称为视图排序的策略可能会解决您的问题。我建议阅读以下内容: 总结一下:您需要使用不同的文档类型,然后使用单个视图来整理结果

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);
}