微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用带有索引的 CouchDB Mango 查询 (/db/_find) 来选择多个 _id 键

如何解决如何使用带有索引的 CouchDB Mango 查询 (/db/_find) 来选择多个 _id 键

我正在使用 CouchDB 3.1.1 对包含大量文档的数据库执行 Mango 查询。我的应用程序中一个非常常见的要求是对一组非常具体和动态的文档执行查询。根据我目前的理解,这些是我如何面对我的问题的唯一选择:

  1. 向 /db/_find 发出多个请求,每个请求都有一个不同的“_id”
  2. 对 /db/_find 进行一次调用

我可以完成第二个选择的方法

  • 对所有“_id”:值对使用“$or”数组
  • 对“_id”键的所有值使用“$or”数组

第二个选择是我更喜欢使用的,因为发出多个 POST 请求会产生开销。不幸的是,使用“$or”似乎妨碍了查询引擎使用“_id”索引。

因此,选项 #1 以每个事务 2 毫秒的速度返回,但结果未排序(需要我的应用程序进行排序)。选择 #2,给定一个包含 2 个 _id 的数组,无论 $or 语法如何,都需要 3 秒以上的时间来呈现。

针对特定文档集使用 CouchDB Mango 查询索引的最有效方法是什么?

快速示例:使用单个 _id 的结果

{
   "selector": {
      "_id": "184094"
   },"fields": [
      "_id"
   ]
}

检查的文件26,312
返回结果:1
执行时间:2 ms

慢速示例:使用 $or 键/值对的结果

{
   "selector": {
      "$or": [
         {
            "_id": "184094"
         },{
            "_id": "157533"
         }
      ]
   },312
结果返回:2
执行时间:2,454 毫秒

慢速示例:使用 $ 或值数组的结果

{
   "selector": {
      "_id": {
         "$or": [
            "184094","157533"
         ]
      }
   },522 毫秒

慢速示例:使用 $in 的结果(这是非法的,但仍会返回结果)

{
   "selector": {
      "_id": {
         "$in": [
            "184094",618 毫秒

Index:_id 的注册索引

{
  "_id": "_design/508b5b51e6085c2f96444b82aced1e5dfec986b2","_rev": "1-f951eb482f9a521752adfdb6718a6a59","language": "query","views": {
    "foo-index": {
      "map": {
        "fields": {
          "_id": "asc"
        },"partial_filter_selector": {}
      },"reduce": "_count","options": {
        "def": {
          "fields": [
            "_id"
          ]
}}}}}

解释:对慢查询之一进行的“解释”总结。请注意,使用了注册索引。

{
 "dbname": "dnp_person_comment","index": {
  "ddoc": "_design/508b5b51e6085c2f96444b82aced1e5dfec986b2","name": "foo-index","type": "json","partitioned": false,"def": {
   "fields": [
    {
     "_id": "asc"
    }
   ]
  }
 },"selector": {
  "$or": [
   {
    "_id": {
     "$eq": "184094"
    }
   },{
    "_id": {
     "$eq": "157533"
    }
   }
  ]
 },"opts": {
  "use_index": [],"bookmark": "nil","limit": 25,"skip": 0,"sort": {},"fields": [
   "_id"
  ],"partition": "","r": [
   49
  ],"conflicts": false,"stale": false,"update": true,"stable": false,"execution_stats": false
 },"fields": [
  "_id"
 ],"mrargs": {
  "include_docs": true,"view_type": "map","reduce": false,"partition": null,"start_key": [],"end_key": [
   "<MAX>"
  ],"direction": "fwd","conflicts": "undefined"
 }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。