CouchDB 查询 no index exists for this sort 错误

CouchDB query no index exists for this sort error

这个问题我已经看过很多次了,但我在这里问同样的问题。

为什么会出现此错误:

Error running query. Reason: (no_usable_index) No index exists for this sort try indexing by the sort fields.

我是 运行 具有超级账本结构的区块链服务,我正在为世界状态使用 CouchDB。在这些数据中,我有一个日期字段,我想按日期对数据进行排序。这是我的 Mango 查询:

{
   "selector": {
      "date": {
         "$gte": null
      },
      "_id": {
         "$gte": null
      }
   },
   "fields": [
      "_id",
      "date"
   ],
   "sort": [
      {
         "date": "asc"
      }
   ]
}

需要说明的是,日期是一个字符串。自从我尝试了一切以来,我不知道这里发生了什么。我尝试使用 table 的任何字段进行排序,但唯一可以排序和工作的字段是:_id

我什至尝试了再次位于 _id 下的 _rev 字段,但仍然出错。

{
   "selector": {
      "_rev": {
         "$gte": null
      },
      "_id": {
         "$gte": null
      }
   },
   "fields": [
      "_id",
      "_rev"
   ],
   "sort": [
      {
         "_id": "asc"
      },
      {
         "_rev": "asc"
      }
   ]
}

这是我的数据示例:

{
 "id": "438c5ad0868db83201bdc36edb7705e3081c73821b20d14d4c4251af3e49c04e",
 "key": "438c5ad0868db83201bdc36edb7705e3081c73821b20d14d4c4251af3e49c04e",
 "value": {
  "rev": "1-4f2cc5b932d393a88b3497a3942fff33"
 },
 "doc": {
  "_id": "438c5ad0868db83201bdc36edb7705e3081c73821b20d14d4c4251af3e49c04e",
  "_rev": "1-4f2cc5b932d393a88b3497a3942fff33",
  "company": "greenTea",
  "date": "2022-02-04 15:40:23.337 +0000 UTC",
  "fromacc": "Gary",
  "operation": "",
  "txid": "438c5ad0868db83201bdc36edb7705e3081c73821b20d14d4c4251af3e49c04e",
  "type": "transaction",
  "~version": "CgMBBwA="
 }
}

我已经尝试了我在网上找到的任何东西,但我无法让它工作。 任何帮助或建议,甚至是好的文档,我们都将不胜感激。

谢谢

除了收集结果所需的完整 table 扫描之外,想象一下如果内存中有 100 亿个文档需要排序会发生什么。

如果要对字段进行排序,需要在date上创建索引。

只需像这样添加一个索引。

{
   "index": {
      "fields": [
         "date"
      ]
   },
   "name": "date-index"
}

你会发现这个查询成功了:

{
   "selector": {
      "date": {
         "$gte": null
      },
      "_id": {
         "$gte": null
      }
   },
   "fields": [
      "_id",
      "date"
   ]
}

这个查询可能会有一些效率

{
   "selector": {
      "date": {
         "$gte": 9
      },
      "_id": {
         "$gte": 9
      }
   },
   "fields": [
      "_id",
      "date"
   ]
}

由于两个字段都是字符串类型,见3.2.2.5. Collation Specification