我有一个用例,我必须删除存储在沙发库中的实体子集,例如删除所有键以“pii_”开头的实体。我正在使用 NodeJS SDK,但只有一种删除方法,一次需要一个键:http: //docs.couchbase.com/sdk-api/couchbase-node-client-2.0.0/Bucket.html#remove
在某些情况下,需要删除数千个实体,如果我一一删除它们需要很长时间,特别是因为我没有在我的应用程序中保留键列表。
我有一个用例,我必须删除存储在沙发库中的实体子集,例如删除所有键以“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 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”),则备用查询可能如下所示。
<bucket_name>
where type='Feature' and parent_id=8;但我更喜欢使用查询的第一个版本,因为它对键进行操作,并且我相信 Couchbase 必须有一些内部索引才能更快地对键(和其他元数据)进行操作/查询。
实现这一点的最佳方法是按键创建一个 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 ,在这种情况下,您可以遍历它们并开始删除。
最好的,