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



我需要获取文档,其中createdBy=userId或updateBy= userId。 我在 CouchDB 中有下一个地图功能:

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

和节点.js后端

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

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

据我了解,您还不能从单个请求中执行OR。

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

使用开始键和结束键语法,OR 等效于:

创建者

  • 开始键=[约翰]
  • endkey=[john,{}]

更新者

  • 开始键=[空,约翰]

  • endkey=[{},john]

然后,您可以执行两个结果集的并集。

如果您使用的是CouchDB 2.X,则应将Mango选择器与$or运算符一起使用。

其他解决方案

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

例如,您可以同时索引 updateBy 和 createdBy。

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

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

我会这样做:

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

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

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

include_docs

查询选项。

最新更新