0

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

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

4

2 回答 2

2

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

在这方面,我认为老式的 RDBMS 更好,你需要做的就是“从数据库中删除某事=某事”。

幸运的是,在 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 $1', layer_name_prefix)
        cb.n1ql_query(query).execute()
    except CouchbaseError, e:
        logger.exception(e)

为了达到同样的目的:如果您要存储“类型”和/或其他元数据(如“父 ID”),则备用查询可能如下所示。

DELETE from <bucket_name>where type='Feature' and parent_id=8;

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

于 2016-10-25T22:14:45.880 回答
1

实现这一点的最佳方法是按键创建一个 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 ,在这种情况下,您可以遍历它们并开始删除。

最好的,

于 2015-06-16T15:32:56.757 回答