Cloudant在可为空的字段上排序

问题描述

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

是否可以使用查询索引来执行此操作。我希望所有文档都按排序顺序排列,但也没有 name 字段。

例如: 以下是一些文档:

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

以下是我要执行的查询

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

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

解决方法

您的查询对我而言毫无意义。您正在请求列出具有或没有特定字段(意味着每个文档)的文档,并希望对该字段上可能存在或不存在的文档进行排序。此类订单并非开箱即用。

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

另一种解决方案是使用视图而不是Cloudant Query索引。我尚未对此进行测试,但希望其意图很明确:

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

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

查询视图应返回按此复合键按字典顺序排列的文档(如果需要,可以使用查询参数将其反转)。