删除具有公共密钥模式的多个 couchbase 实体

Delete multiple couchbase entities having common key pattern

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

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

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

例如,您的 Couchbase 视图可能如下所示:

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,在这种情况下,您可以遍历它们并开始删除。

最佳,

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

在这方面,我认为老式的 RDBMS 更好,您只需 'DELETE * from database where something=something'。

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

中的做法

要使用的查询:DELETE from <bucketname> b where META(b).id LIKE "%"

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

要实现相同的目的:如果您正在存储 'type' and/or 其他元数据,例如 'parent_id'。

,则备用查询可以如下所示

<bucket_name> 中删除,其中类型='Feature' 和 parent_id=8;

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