我有这个观点:
function (doc) {
if (doc.type && doc.type=='accounts') {
emit( doc._id );
}
}
我可以通过这个网址获得一个json:
http://127.0.0.1:5984/crm/_design/accounts/_view/accounts-view?include_docs=true
我的结果是:
{"total_rows":3,"offset":0,"rows":[
{"id":"8767d3474a0e80dd0ab7d0b0580065af","key":"8767d3474a0e80dd0ab7d0b0580065af","value":null,"doc":{"_id":"8767d3474a0e80dd0ab7d0b0580065af","_rev":"1-37eb3e76e4715e9a4fc8930470cc4ca3","type":"accounts","lastname":"Kitchen","firstname":"Peter"}},
{"id":"8767d3474a0e80dd0ab7d0b058006e3c","key":"8767d3474a0e80dd0ab7d0b058006e3c","value":null,"doc":{"_id":"8767d3474a0e80dd0ab7d0b058006e3c","_rev":"1-bcab94bb253c83b4951a787c253896f5","type":"accounts","lastname":"Kolner","firstname":"John"}},
{"id":"8767d3474a0e80dd0ab7d0b058008e9a","key":"8767d3474a0e80dd0ab7d0b058008e9a","value":null,"doc":{"_id":"8767d3474a0e80dd0ab7d0b058008e9a","_rev":"1-86078f00be82b97499a0f52488cefbbf","lastname":"Tower","firstname":"George","type":"accounts"}}
]}
第一个问题,为什么我有'_id'和'key'字段;两者都是一样的。 第二个问题,当我在url上添加一个参数来过滤id:
http://127.0.0.1:5984/crm/_design/accounts/_view/accounts-view?include_docs=true&id=8767d3474a0e80dd0ab7d0b0580065af
我得到了相同的结果,我必须如何通过id进行过滤,我认为id是特殊的,因为数据库已经被id索引了,但是如果我被另一个字段过滤呢?
我知道每个视图都占用磁盘空间,所以我可以用一个视图解析所有类型的过滤器并减少?
答案 0 :(得分:1)
首先,您使用的 id 查询参数无效。有关查询参数的完整列表,请参阅此page。
其次,视图总是发出3个键。
因此,如果你构建一个发出id的视图,它就完全没用了。
您可能会问:但为什么要发出ID和密钥?
想象一下,您可以在每个人的电话号码上构建map / reduce。您将能够从某个电话号码获取所有文件。出于索引原因,您需要在发出的值/键与文档ID之间保持链接。如果您更新文档,则视图需要更新,因此没有任何ID,这是不可能的。