使用正则表达式形式的密钥删除couchbase存储桶中的条目

时间:2014-01-31 12:35:06

标签: couchbase

我有一个要求,我必须从couchbase存储桶中删除一个条目。我使用我传递密钥的Java应用程序中的CouchbaseCient的delete方法。但在一个特殊情况下,我没有完整的关键名称,而是它的一部分。所以我认为会有一个方法需要一个匹配器,但我找不到一个。以下是存储在存储桶中的实际密钥

  123_xyz_havefun

我所拥有的密钥部分是xyz。我不确定是否可以这样做。任何人都可以提供帮助。

3 个答案:

答案 0 :(得分:6)

Couchbase的DELETE操作既不支持通配符,也不支持正则表达式。因此,您必须以某种方式获取密钥列表并将其传递给函数。例如,您可以使用Couchbase Views或通过APPEND命令维护您自己的密钥列表。就像创建密钥xyz并在应用程序生命周期中将所有匹配的密钥附加到其值,并在实际删除请求后刷新此密钥

答案 1 :(得分:3)

好吧,我认为你可以使用通配符或正则表达式来实现删除。

以上答案基本上说,   - 查询Couchbase中的数据   - 迭代结果集   - 并删除您感兴趣的每个密钥。

但是,我相信:服务器上的删除应该在服务器上删除,而不是像上面那样需要三个步骤。

在这方面,我认为老式的RDBMS更好你所需要做的就是从数据库中解雇SQL查询,例如"匹配%"'。

幸运的是,CouchBase中有类似于SQL的东西叫做N1QL(发音为nickle)。我不知道JavaScript(和其他语言语法),但这是我在python中做到的。

要使用的查询:从b中删除META(b).id LIKE"%"

layer_name_prefix = cb_layer_key + "|" + "%"
query = ""
try:
    query = N1QLQuery('DELETE from `test-feature` b where META(b).id LIKE $1', layer_name_prefix)
    cb.n1ql_query(query).execute()
except CouchbaseError, e:
    logger.exception(e)

要实现同样的目的:如果您要存储'类型',则备用查询可以如下所示:和/或其他元数据,例如' parent_id'。

DELETE from type =' Feature'和parent_id = 8;

但我更喜欢使用查询的第一个版本,因为它在密钥上运行,我相信Couchbase必须有一些内部索引才能在密钥(和其他元数据)上更快地操作/查询。

答案 2 :(得分:0)

虽然确实无法使用正则表达式迭代文档,但您可以创建一个新视图并让map函数只发出与正则表达式匹配的键。

一个(显然是人为的,可怕的正则表达式)示例地图函数可以是:

function(doc, meta) {
  if (meta.id.match(/_xyz_/)) {
    emit(meta.id, null);
  }
}

另一种想法是从每个文档中提取密钥的那一部分然后发出。这将允许您使用相同的索引来匹配特定键形式的不同文档。

function(doc, meta) {
  var match = meta.id.match(/^.*_(...)_.*$/);
  if (match) {
    emit(match[1], null);
  }
}

在您的情况下,这将为每个文档发出密钥xyz(或每个密钥的相应组件)。然后,您可以使用startkeyendkey根据您的条件进行限制。

最后,信息检索研究空间中有大量选项可用于构建可在此处应用的文本索引。我会将您推荐给this doc on permuterm indexes以帮助您入门。