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

时间:2015-06-16 08:43:16

标签: node.js couchbase couchbase-nodejs-sdk bulk-delete

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

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

2 个答案:

答案 0 :(得分:2)

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

在这方面,我认为老式的RDBMS更好你需要做的就是'从数据库中删除*,某些东西'。

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

要使用的查询:从<bucketname> 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)

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

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

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

答案 1 :(得分: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,在这种情况下,您可以循环它们并开始删除。

最佳,

相关问题