Couchdb 视图不适用于多个过滤器

Posted

技术标签:

【中文标题】Couchdb 视图不适用于多个过滤器【英文标题】:Couchdb view not working for multiple filter 【发布时间】:2019-12-23 07:59:38 【问题描述】:

Couchdb 视图文档不适用于多个过滤器。

这些是我的示例文档


  "_id": "test_1234",
  "_rev": "1-ff074e2f5a6e1c4e036703524fcebca3",
  "data": 
    "userid": 1,
    "year": 1989,
    "name": "Aro",
    "type": "test"
  



  "_id": "test_1235",
  "_rev": "1-bb86f782333c1510391f3b54d9d3a6ad",
  "data": 
    "userid": 2,
    "year": 1990,
    "name": "Babu",
    "type": "test"
  



  "_id": "test_1236",
  "_rev": "1-02f1b6b9dcbadcad88160d996a1c4361",
  "data": 
    "userid": 3,
    "year": 1989,
    "name": "Siva",
    "type": "test"
  

这是我的查看文档

 
  "_id": "_design/testview",
  "_rev": "4-53e5fcd4dedc4e02e26844ceea70a018",
  "views": 
    "testview": 
      "map": "function (doc) if(doc.data.type === \"test\")  emit([doc.data.userid,doc.data.year,doc.data.name], null);"
    
  ,
  "language": "javascript"

所以我的视图结果如下所示

"total_rows":3,"offset":0,"rows":[
"id":"test_1234","key":[1,1989,"Aro"],"value":null,
"id":"test_1235","key":[2,1990,"Babu"],"value":null,
"id":"test_1236","key":[3,1989,"Siva"],"value":null
]

lhbwfjewbfj wfwfwejf bwefw whj ffbjhkwv hfv wevwvweh vhvf

我需要为以下参数过滤文档

用户 ID:1 到 3 年份 : 1989 姓名:阿罗

所以我创建了如下查询

viewtest/_design/testview/_view/testview?startkey=[1,1989,"Aro"]&endkey=[3,1989,"Aro\ufff0"]

我对此的预期输出

"total_rows":3,"offset":0,"rows":[
"id":"test_1234","key":[1,1989,"Aro"],"value":null
]

但实际输出是

"total_rows":3,"offset":0,"rows":[
"id":"test_1234","key":[1,1989,"Aro"],"value":null,
"id":"test_1235","key":[2,1990,"Babu"],"value":null
]

为什么?我的代码有什么问题?

【问题讨论】:

【参考方案1】:

键遵循简单的ordered collation,因此startkey=[1,...]endkey=[3,...] 匹配所有键,例如 [2, ...]。由于 2 大于 1 且小于 3,因此无需比较不重要的元素。

如果您希望根据多个元素过滤结果,您可能需要使用mango queries。

【讨论】:

嗨@lossleader 感谢您的回复。我试过芒果查询。但正则表达式不使用索引。所以查询时间太长了。所以只有我尝试这种方式。我的查询还有其他可能的方式吗? @prabuganesan 视图和 mango 索引使用相同的有序排序规则概念。如果您无法使用排序顺序作为第一阶段来构建查询以消除数据库中最不可能的匹配,那么您就没有使用视图或芒果索引并且正在检查整个数据库。如果你真的需要这样做,你可以看看更像是用 dreyfus 进行全文搜索的东西。

以上是关于Couchdb 视图不适用于多个过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 javascript 在 couchdb 中使用多个组合键进行查询,而无需为每个组合编写单独的视图?

过滤器集字段不适用于多个对象

CouchDB:视图中的过滤函数

过滤器不适用于多对一参考

CouchDb - 防止 couchDb 提供视图

dplyr 取消引用不适用于过滤器功能