排序 Cloudant/CouchDB 搜索时无效的 UTF-8 JSON

Invalid UTF-8 JSON when sorting a Cloudant/CouchDB search

我在将 Cloudant 与 NodeJS 结合使用时收到此错误。

我在数据库中创建了一个搜索索引,并尝试进行以下搜索:

// Query to get last updated entries in database
var query = {
    q: "*:*",
    group_field: "type",
    sort: "-timestamp<number>",
    limit: 1
};

db.search('mydesigndoc', 'mysearchindex', query, function(err, data) {
    if (!err) {
        console.log(JSON.stringify(data));
    } else {
        console.log("No bio data found: " + err);
    }
});

然而,返回的响应是这样的:

{"error":"bad_request","reason":"invalid UTF-8 JSON"}

sort - A JSON string of the form "fieldname<type>" or -fieldname<type> for descending order, where fieldname is the name of a string or number field and type is either number or string or a JSON array of such strings.

我上次检查时,"-timestamp<number>" 是一个 JSON 字符串。

我做错了什么?

问题出在查询对象的处理上。当发送到服务器时,我们可以假定每个属性的字面值。

例如,如果该函数在内部向 Cloudant 发送了一个 URL 表单编码请求,我们会看到如下内容:

/_design/mydesigndoc/_search/mysearchindex?q=*%3A*&group_field=type&sort=-timestamp<number>&limit=1

此处的关键点是引号已被删除,因为它们是字符串。因此,当 Cloudant 看到这一点时,sort 不再是用引号括起来的 JSON 字符串——它是一个普通的字符串!它必须是 JSON,因为排序参数也可以是 JSON 数组,如果您要对多个字段进行排序。

解决方案是简单地在排序中添加转义引号 属性:

var query = {
    q: "*:*",
    group_field: "type",
    sort: "\"-timestamp<number>\"",
    limit: 1
};

现在发送到服务器时会变成这样:

&sort="-timestamp<number>"