CouchDB和过滤_change调用的版本

时间:2013-01-15 10:20:26

标签: couchdb

在我的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?

1 个答案:

答案 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-1234-ijk版本这份文件。

不确定,但我认为这是对数据库数据结构的优化使用,并防止与处理所有非叶子修订的压缩冲突。

相关问题