CouchDB中的奇怪JSON

时间:2011-05-25 18:49:02

标签: json couchdb

我正在学习CouchDB I并非常喜欢它的功能。但有一件事让我感到困惑,而且CouchDB通过JSON进行通信也是一种说法。

实际上,JSON要求对象的键是字符串,而it is possible,甚至advised by Damien Katz himself都要有返回其键是其他对象或数组的对象的视图。

这很令人困惑,因为我没有发现CouchDB使用JSON变体的任何地方。此外,由于至少有两个原因,它没有多大意义:

  1. 两个键何时被视为相等?例如,我假设如果CouchDB允许不是字符串的键,则允许使用数字。但是密钥5'5'会有所不同,这很奇怪,因为在Javascript中它们被认为是相同的。

  2. 更重要的是,解析CouchDB的输出将更加困难,因为不能使用可用于每种语言的标准JSON解析器。

  3.   

    我只是在解释上述链接时感到困惑,还是实际上CouchDB返回了非标准的JSON输出?如果是这样,一个人如何使用它?

3 个答案:

答案 0 :(得分:5)

文档ID _id)字段必须是字符串。 查看密钥emit()的第一个参数)可以是任何JSON值。你是对的,这有点令人困惑。

根据CouchDB collation specification,两个键被认为是相等的。基本上,价值观与您期望的相比:

  • 数字按值排序
  • 根据libicu规则对字符串进行排序。
  • 数组通过比较第一个值,第二个值等进行排序

当然,对于文档ID ,唯一重要的是字符串排序,因为文档ID总是字符串。

最后,CouchDB始终输出标准JSON。如果您遇到来自CouchDB的非标准JSON,这是一个错误,社区希望听到它。

答案 1 :(得分:3)

不要混淆对象的键和couchdb视图的键。

CouchDB视图结果中的每一行都包含id,key和value。 id是一个字符串,keyvalue可以是任何对象。将非字符串值作为键是很常见的。

以下是使用非字符串键的示例视图结果。

$ curl http://127.0.0.1:5984/blog/_design/posts/_view/by_date
{"total_rows":3,"offset":0,"rows":[
{"id":"88e325c07e897f52766340dc17003322","key":[2010,10,13],"value":null},
{"id":"88e325c07e897f52766340dc17002641","key":[2011,4,5],"value":null},
{"id":"88e325c07e897f52766340dc1700233e","key":[2011,4,23],"value":null}
]}

答案 2 :(得分:1)

我想这可以解释它。

enter image description here

第二个想法,键是map / reduce操作的一部分,所以我将不得不深入研究。