Cloudant 在可空字段上排序

Cloudant Sorting on a nullable field

我想对一个字段进行排序,假设 name 在 Cloudant DB 中建立了索引。我通过使用不带 sort 的索引获取所有具有此名称字段和不具有此名称字段的文档。但是当我尝试使用名称 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 字段的文档。

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

我会去掉选择器中的name子句,只对每个文档中出现的classId字段进行排序,然后在客户端进行二次偏序,这样你就可以决定你打算如何混入没有名称字段的文件与有名称字段的文件。

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

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

这会将文档键入“classId-name”,对于没有名称的文档,指定标记值。

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