我正在学习CouchDB I并非常喜欢它的功能。但有一件事让我感到困惑,而且CouchDB通过JSON进行通信也是一种说法。
实际上,JSON要求对象的键是字符串,而it is possible,甚至advised by Damien Katz himself都要有返回其键是其他对象或数组的对象的视图。
这很令人困惑,因为我没有发现CouchDB使用JSON变体的任何地方。此外,由于至少有两个原因,它没有多大意义:
两个键何时被视为相等?例如,我假设如果CouchDB允许不是字符串的键,则允许使用数字。但是密钥5
和'5'
会有所不同,这很奇怪,因为在Javascript中它们被认为是相同的。
更重要的是,解析CouchDB的输出将更加困难,因为不能使用可用于每种语言的标准JSON解析器。
我只是在解释上述链接时感到困惑,还是实际上CouchDB返回了非标准的JSON输出?如果是这样,一个人如何使用它?
答案 0 :(得分:5)
文档ID (_id
)字段必须是字符串。 查看密钥(emit()
的第一个参数)可以是任何JSON值。你是对的,这有点令人困惑。
根据CouchDB collation specification,两个键被认为是相等的。基本上,价值观与您期望的相比:
当然,对于文档ID ,唯一重要的是字符串排序,因为文档ID总是字符串。
最后,CouchDB始终输出标准JSON。如果您遇到来自CouchDB的非标准JSON,这是一个错误,社区希望听到它。
答案 1 :(得分:3)
不要混淆对象的键和couchdb视图的键。
CouchDB视图结果中的每一行都包含id,key和value。 id
是一个字符串,key
和value
可以是任何对象。将非字符串值作为键是很常见的。
以下是使用非字符串键的示例视图结果。
$ 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)
我想这可以解释它。
第二个想法,键是map / reduce操作的一部分,所以我将不得不深入研究。