具有$ or和$ and的CouchDB索引不起作用,但只有$ and起作用

时间:2018-12-18 22:23:17

标签: couchdb pouchdb couchdb-2.0 couchdb-mango

由于某些原因,我有以下.find()命令,但索引冲突出现冲突。以下是当我仅尝试获取一种类型的文档时可以使用的一种示例。但是,如果我尝试获取两种类型的文档,由于某种原因它将无法正常工作。

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

我的索引文件:

{
  "_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"}]
});

1 个答案:

答案 0 :(得分:2)

选择器中缺少时间戳

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

冗余条件

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

最后,为了使用索引,您应该使用以下字段创建索引:uid,时间戳,类型(我认为这是可选的)。

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

建议

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