使用正则表达式形式的键删除couchbase bucket中的条目

使用正则表达式形式的键删除couchbase bucket中的条目,couchbase,Couchbase,我需要从couchbase bucket中删除一个条目。我从java应用程序中使用CouchbaseCient的delete方法将密钥传递给它。但是在一个特殊的例子中,我没有完整的密钥名,而是它的一部分。所以我想有一种方法需要匹配器,但我找不到匹配器。以下是存储在铲斗中的实际钥匙 123_xyz_havefun 我的钥匙部分是xyz。我不确定这是否可以做到。有人能帮忙吗。Couchbase的删除操作既不支持通配符,也不支持正则表达式。因此,您必须以某种方式获取键列表并将其传递给函数。例如,

我需要从couchbase bucket中删除一个条目。我从java应用程序中使用CouchbaseCient的delete方法将密钥传递给它。但是在一个特殊的例子中,我没有完整的密钥名,而是它的一部分。所以我想有一种方法需要匹配器,但我找不到匹配器。以下是存储在铲斗中的实际钥匙

  123_xyz_havefun

我的钥匙部分是xyz。我不确定这是否可以做到。有人能帮忙吗。

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

虽然确实不能使用正则表达式迭代文档,但您可以创建一个新视图,并让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
(或每个键对应的组件)。然后,您可以使用
startkey
endkey
根据您的标准进行限制


最后,在信息检索研究领域,有大量的选项可以用于构建文本索引,这些选项可以应用于这里。我将向您介绍如何开始。

好吧,我认为您可以使用通配符或类似正则表达式的表达式实现删除

上面的答案基本上是说,, -从Couchbase查询数据 -迭代结果集 -并为您感兴趣的每一个关键点进行删除

然而,我认为:服务器上的Delete应该是服务器上的Delete,而不是像上面那样需要三个步骤

在这方面,我认为老式的RDBMS更好,您只需从“match%”之类的数据库中启动SQL查询,如“DELETE*”

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

要使用的查询:从b中删除,其中META(b).id类似“%” 为了实现同样的目的:如果您存储的是“type”和/或其他元数据,如“parent_id”,则备用查询可以如下所示

从type='Feature'和parent_id=8处删除;
但我更喜欢使用查询的第一个版本,因为它是在key上运行的,我相信Couchbase必须有一些内部索引,以便在key(和其他元数据)上更快地运行/查询。

正如答案所说,这无法显式完成,而且我知道近期内没有计划将此作为一项功能。
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)