【问题标题】:Cloudant Sorting on a nullable fieldCloudant 对可空字段进行排序
【发布时间】:2020-10-22 07:48:03
【问题描述】:

我想对一个字段进行排序,比如说 name,它在 Cloudant DB 中被索引。我正在获取所有具有此名称字段且不使用不带排序的索引的文档。但是,当我尝试使用名称 field 进行排序时,我没有得到文档中没有此名称字段的文档。

有没有办法通过使用查询索引来做到这一点。我希望所有文档都按排序顺序排列,但也没有 name 字段。

例如: 以下是一些文件:

{
 "_id": 1234,
 "classId": "abc",
 "name": "Happa"
}
{
  "_id": 12345,
  "classId": "abc",
  "name": "Prasanth"
}
{
  "_id": 123456,
  "classId": "abc",
}

下面是我要执行的查询:

{
  "selector": {
    "classId": "abc",
    "name" :{
      "or" : [
        {"$exists": true},{"$exists": false}
      ]
    }
  },
  "sort": [{ "classId": "asc" }, { "name": "asc" }],
  "use_index": "idx-classId_name"
},

我希望所有文档都按排序顺序返回,包括没有 name 字段的文档。

【问题讨论】:

  • 在这种情况下,如果您指定“索引”的含义,将会有所帮助。这是标准的 map-reduce 视图,还是 Cloudant Search(又名 Lucene)索引,还是 Cloudant Query 索引?我不清楚您在问什么-您想要按特定字段排序的文档,包括那些没有该字段的文档?您希望如何对不存在的字段上的文档进行排序?提供一些示例文档,并告诉我们您期望的顺序。
  • @xpqz 很抱歉不清楚。添加了必要的信息。

标签: couchdb cloudant


【解决方案1】:

您的查询对我来说毫无意义。您正在请求具有或不具有特定字段(意味着每个文档)的文档列表,并期望对该字段上可能存在或不存在的文档进行排序。这样的订单不是开箱即用的。

我会从选择器中删除 name 子句,仅对出现在每个文档中的 classId 字段进行排序,然后在客户端进行次要部分排序,这样您就可以决定如何混合文档没有名称字段的人。

另一个解决方案是使用视图而不是 Cloudant 查询索引。我没有对此进行测试,但希望意图很明确:

function(doc) {
    if (doc && doc.classId) {
        var name = doc.name || "[notfound]";
        emit(doc.classId+"-"+name, 1);
    }
}

这将在“classId-name”上键入文档,对于没有名称的文档,一个指定的哨兵值。

查询视图应返回在此复合键上按字典顺序排列的文档(如果您愿意,可以使用查询参数反转)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 2011-09-14
    • 2023-03-15
    相关资源
    最近更新 更多