【问题标题】:Index & sort with newly introduced field使用新引入的字段进行索引和排序
【发布时间】:2019-10-13 18:16:30
【问题描述】:

我的文档结构如下:

{
  "_id": "6ed3d427045228dce9e3b38d111cb046",
  "_rev": "1-952bddae5572fbf2b0ce4a165c19c98b",
  "type": "USER",
  "name": "ABC",
  "email": "abc@gmail.com",
  "phone": "024578963"
}

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

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

{
  "_id": "6ed3d427045228dce9e3b38d111cb046",
  "_rev": "1-952bddae5572fbf2b0ce4a165c19c98b",
  "type": "USER",
  "name": "ABC",
  "email": "abc@gmail.com",
  "phone": "024578963",
  "created_date": 1570528394252
}

因此,自某个时间以来的所有最新文档都包含created_date,而旧文档在文档中没有created_date 字段。

当我尝试如下排序时:

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 方法可以解决这个问题吗?此类问题的最佳做法是什么。

【问题讨论】:

  • 对于没有created_date 的旧文档,你想做什么?你也想索引那些旧文档吗?
  • @arunp9294 是的,我需要用created_date 索引那些旧文档。
  • 您是否在某个地方为用户创建了 created_date?..如果您没有,我将修复的方法是编写一个视图以获取所有用户文档而不使用 created_date 并批量更新所有文档with with created_date(可能是数据库中可用的最旧 created_date)
  • created_date 在数以千计的文档添加到数据库后添加

标签: node.js database sorting couchdb couchdb-nano


【解决方案1】:

我做了一些测试,发现CouchDB 根本不包含_find 结果中的文档,如果它们不包含sort 中指定的字段(属性)。在我看来,这是一个错误,因为sort 意外地减少了过滤结果。这在将CouchDBPouchDB 一起使用时尤其烦人,因为后者按预期工作(也返回缺少属性的文档)。

按照上面评论中的建议将缺失的属性添加到现有文档可能会解决您的问题。然而,在许多情况下(即对于数字和布尔属性),这不是一个可行的解决方案,因为文档内容可能被伪造。

您的问题的简短回答:在许多情况下,没有直接的CouchDB 方法可以解决此问题。

更新:

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

missing:为缺少的文档指定排序过程 指定用于排序的字段中的值。缺失值可以是 首先,在这种情况下,缺失值的结果出现在其他结果之前 结果;或最后一个(默认),在这种情况下它们出现在之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 2020-02-22
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多