删除具有通用键模式的多个沙发基础实体



>我有一个用例,我必须删除存储在 couchbase 中的实体子集,例如删除所有键以"pii_"开头的实体。我正在使用 NodeJS SDK,但只有一种删除方法一次需要一个密钥:http://docs.couchbase.com/sdk-api/couchbase-node-client-2.0.0/Bucket.html#remove

在某些情况下,需要删除数千个实体,如果我一个接一个地删除它们,则需要很长时间,特别是因为我没有在我的应用程序中保留键列表。

我同意@ThinkFloyd的说法,他说:服务器上的删除应该是在服务器上删除的,而不是需要三个步骤,例如从服务器获取数据,在客户端迭代它,最后对于每个记录再次在服务器上触发删除。

在这方面,我认为老式的RDBMS更好,您需要做的就是"从数据库中删除*,其中某物=某物"。

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

要使用的查询:从 <bucketname> b 中删除,其中 META(b).id 类似于 "%"

    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"),则备用查询可能如下所示。

从类型="功能"和parent_id=8 的<bucket_name>中删除;

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

实现此目的的最佳方法是按键创建 Couchbase 视图,然后通过 NodeJS 代码对该视图进行范围查询,对结果进行删除。

  • http://docs.couchbase.com/admin/admin/Views/views-querySample.html
  • http://docs.couchbase.com/couchbase-manual-2.0/#couchbase-views-writing-querying-selection-partial
  • http://docs.couchbase.com/sdk-api/couchbase-node-client-2.0.8/ViewQuery.html

例如,您的沙发基视图可能如下所示:

function(doc, meta) {
    emit(meta.id, null);
}

然后在你的 NodeJS 代码中,你可以有如下所示的东西:

var couchbase = require('couchbase');
var ViewQuery = couchbase.ViewQuery;
var query = ViewQuery.from('designdoc', 'by_id');
query.range("pii_", "pii_" + "u0000", false);
var myBucket = myCluster.openBucket();
myBucket.query(query, function(err, results) {
    for(i in results) {
        // Delete code in here
    }
});

当然,您的Couchbase设计文档和视图的名称将与我给出的示例不同,但重要的部分是所使用的ViewQuery.range函数。

将返回所有以 pii_ 为前缀的文档 ID,在这种情况下,您可以循环访问它们并开始删除。

最好

相关内容

  • 没有找到相关文章