在我的couchDB数据库中,我有一个过滤器,它只发出doc.my_key == "value"
这样的文档:
{
"id": "_design/test".
"filters": {
"value_only": "function(doc){return (doc['my_key'] == 'value');}"
}
}
当我写这样两个文件时:
{
"id": 1,
"my_key": "cheeky"
}
{
"id":2,
"my_key": "value"
}
然后/this_database/_changes?filter=test/value_only
的json读取:
{
"results":[
{"seq":2,"id":"2","changes":[{"rev":"1-463e18b34dfa529dd9b39981ad3293f4"}]},
],
"last_seq":4
}
这很酷。 CouchDB很酷。但是我现在更新文档#2:
{
"id":2,
"my_key": "no longer value"
}
已过滤的更改Feed现在为空。我知道这是因为当文档更新时,该文档的先前seq编号将从更改源中删除,但是我可以传递/配置编辑的任何参数我可以使我返回最近发布的修订版本文件的ID?
答案 0 :(得分:1)
突然间,没有更改Feed的参数。您可以处理所有更改事件的唯一方法是将Feed作为连续流进行侦听。但是,即使是这种情况也无法保证,由于压实作业的竞争条件,可以获得收到的修订号。
如果存在任何冲突(例如,文档有两个具有不同叶版本的“头”),则更改源仅发出叶子修订和获胜的版本。对于后者,您可以传递?style=all_docs
查询参数来检索文档的所有已存在的叶子。
例如:
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
' Document with _id foo '
' '
' +-----------------+ +-------+ +-------+ +-------+ '
' | 1-abc | ----> | 2-cde | ----> | 3-fgh | --> | 4-ijk | '
' +-----------------+ +-------+ +-------+ +-------+ '
' | '
+ - - - - - - - - - - - - | - - - - - - - - - - - - - - +
' | '
' | '
' v '
' +-------+ '
' | 3-123 | '
' +-------+ '
' '
+ - - - - - +
默认行为(style=main_only
)将产生获胜版本:4-ijk
,而对于style=all_docs
,更改Feed会产生3-123
和4-ijk
版本这份文件。
不确定,但我认为这是对数据库数据结构的优化使用,并防止与处理所有非叶子修订的压缩冲突。