如何在CouchDB中使用运算符OR?

时间:2018-06-01 13:32:45

标签: node.js couchdb couchbase-view couchdb-futon

我需要获取doc,其中createdBy = userId或updatedBy = userId。 我在CouchDB中有下一个map func:

function (doc) {
                        if (doc.$doctype === 'Records') {
                            emit([doc.createdBy, doc.updatedBy], doc);
                        }
                    }

和node.js后端

getData: async (userId) => {
        return await adapter.getRows(
            'Records', 'url',
            {
                startkey: [userId, userId],
                endkey: [userId],
            }
        );
    }

但它作为运算符AND。请帮我找错。

2 个答案:

答案 0 :(得分:0)

根据我的理解,你还不能通过单一请求进行OR。

(从CouchDB 2.1开始,_queries端点尚不可用。将来,您将能够在同一HTTP请求中请求多个查询。

使用startkey和endkey语法,OR将等同于:

<强> createdBy

  • startKey = [约翰]
  • endkey = [约翰,{}]

<强> updatedBy

  • startKey = [零,约翰]

  • endkey = [{},约翰]

然后,您可以对两个结果集进行并集。

如果您使用的是CouchDB 2.X,则应使用带有 $或运算符的Mango选择器。

其他解决方案

您可以为此请求创建特定视图。

例如,您可以索引updatedBy和createdBy。

if (doc.$doctype === 'Records') {
   emit([doc.createdBy, doc.createdAt]);
   emit([doc.updatedBy, doc.createdAt]);
}

然后,您可以使用startkey=[author]&endkey=[author,{}]

进行查询

答案 1 :(得分:0)

我会这样:

function (doc) {
   if (doc.$doctype === 'Records') {
       emit(doc.createdBy, "created");
       emit(doc.updatedBy, "updated");
   }
}

然后您可以使用userID的单个键进行查询,如果需要的话,该值是有关操作的额外信息,否则可以将其保留为零。

请勿发出doc值,因为这是多余的,您始终可以使用

获取该文档
  

include_docs

查询选项。