排序 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>"
我在将 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>"