首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用新引入的字段进行索引和排序

使用新引入的字段进行索引和排序
EN

Stack Overflow用户
提问于 2019-10-11 16:10:35
回答 1查看 134关注 0票数 0

我的文档结构如下:

代码语言:javascript
复制
{
  "_id": "6ed3d427045228dce9e3b38d111cb046",
  "_rev": "1-952bddae5572fbf2b0ce4a165c19c98b",
  "type": "USER",
  "name": "ABC",
  "email": "abc@gmail.com",
  "phone": "024578963"
}

这是NodeJS应用程序,我正在使用couchdb-nano。出于排序的目的(比如获取用于分页的数据),我为上述字段(nameemailphone)创建了一个索引。

文档中引入了一个名为created_date的新字段,所有最新文档都包含created_date,如下所示:

代码语言:javascript
复制
{
  "_id": "6ed3d427045228dce9e3b38d111cb046",
  "_rev": "1-952bddae5572fbf2b0ce4a165c19c98b",
  "type": "USER",
  "name": "ABC",
  "email": "abc@gmail.com",
  "phone": "024578963",
  "created_date": 1570528394252
}

因此,自特定时间以来所有最新文档都由created_date组成,而旧文档在文档中没有created_date字段。

当我尝试像下面这样排序时:

代码语言:javascript
复制
const q = {
      selector : {
        type: { "$eq": "USER" },
      },
      fields : ['name', 'email', 'phone', 'created_date'],
      limit: 100,
      skip: 10,
      sort : [{"created_date":"asc"}]
    };
await prodresdb.find(q);

我将无法获取不包含created_date的旧文档。这是因为created_date索引不会索引旧文档,因为这些文档没有created_date字段。

我相信其他人也有这个问题,需要弄清楚...如何克服这一点?有什么CouchDB方法可以解决这个问题吗?解决这类问题的最佳实践是什么?

EN

回答 1

Stack Overflow用户

发布于 2019-10-12 14:04:20

我做了几个测试,发现如果文档不包含sort中指定的字段(属性),CouchDB就不会在_find结果中包含文档。在我看来,这是一个错误,因为sort意外地减少了过滤结果。当将CouchDBPouchDB一起使用时,这尤其令人讨厌,因为后者的工作方式与预期相同(也会返回缺少属性的文档)。

按照上面注释中的建议,向现有文档添加缺少的属性可能会解决您的问题。然而,在许多情况下(例如,对于数字和布尔值属性),这不是一个可行的解决方案,因为文档内容可能被篡改。

对您的问题的简短回答:在许多情况下,没有直接的CouchDB方法来解决这个问题。

更新:

有趣的是,类似的产品Couchbase Server通过允许fine-grained control over the sort-procedure通过missing字段来解决这个问题-全文搜索结果。

missing :为指定排序的字段中缺少值的文档指定排序过程。missing的值可以是first,在这种情况下,缺少值的结果显示在其他结果之前;或者last (默认值),在这种情况下,它们显示在。

之后

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58336933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档