【问题标题】:CouchDB index with $or and $and not working but just $and does带有 $or 和 $and 的 CouchDB 索引不起作用,但只有 $and 起作用
【发布时间】:2019-05-19 09:35:01
【问题描述】:

出于某种原因,我有以下.find() 命令,并且遇到了冲突的索引错误。以下是我仅尝试获取一种类型的文档时的一个工作示例。但是,如果我尝试获取 2 种类型的文档,由于某种原因它不起作用。

有人知道为什么会这样吗?

我的索引文件:

{
  "_id": "_design/index",
  "_rev": "3-ce41abcc481f0a180eb722980d68f103",
  "language": "query",
  "views": {
    "index": {
      "map": {
        "fields": {
          "type": "asc",
          "timestamp": "asc"
        },
        "partial_filter_selector": {}
      },
      "reduce": "_count",
      "options": {
        "def": {
          "fields": [
            "type",
            "timestamp"
          ]
        }
      }
    }
  }
}

作品:

var result = await POUCHDB_DB.find({
  selector:{
    $and: [{type:"document"},{uid:"123"}]
  },
  limit:50, 
  bookmark: bookmark, 
  sort: [{timestamp: "desc"}]
});

不起作用:

var result = await POUCHDB_DB.find({
  selector:{
    $or: [
      {$and: [{type:"document"},{uid:"123"}]},
      {$and: [{type:"page"},{uid:"123"}]}
      ]
  },
  limit:50, 
  bookmark: bookmark, 
  sort: [{timestamp: "desc"}]
});

【问题讨论】:

    标签: couchdb pouchdb couchdb-2.0 couchdb-mango


    【解决方案1】:

    选择器中缺少时间戳

    为了使用时间戳进行排序,它必须在您的选择器中。您可以简单地使用 "$gte":null 添加它。

    冗余条件

    uid 对于您的查询似乎是多余的。因此,我会将其添加到单独的条件中。

    最后,为了使用你的索引,你应该创建一个包含以下字段的索引:uid、timestamp、type(我认为这个是可选的)。

    {
      "selector": {
        "$and": [{
            "uid": "123",
            "timestamp": {
              "$gte": null
            }
          },
          {
            "$or": [{
                "type": "document"
              },
              {
                "type": "page"
              }
            ]
          }
        ]
      },
      "sort": [{
        "timestamp": "desc"
      }]
    }
    

    建议

    如果您希望您的查询使用您的索引,我建议您指定“use_index”字段。如果您可以对索引和查询进行版本控制,它将使查询更快。

    【讨论】:

    • 当我执行createIndex 时,它最终工作了,但当我出于某种原因编辑索引时却没有。出于某种原因,当我在索引['timestamp', 'type', 'uid', 'document_id'] 中添加另一个类型键时,它直到我做了['timestamp', 'type', 'uid'']['timestamp', 'type', 'document_id'] 才起作用,这有意义吗?它应该是这样工作的吗?
    • 当你说“它不工作”时,你的意思是索引没有被选中?通常,索引会使用 uid 和时间戳查询索引,因为它们可以轻松缩小结果范围。然后,他们会为 $or 查询(我认为)进行内存过滤。
    猜你喜欢
    • 2015-02-26
    • 2013-12-16
    • 2016-10-24
    • 2020-02-19
    • 2013-06-17
    • 2021-11-10
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多