删除具有公共密钥模式的多个 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 代码对该视图进行范围查询,并对结果进行删除。
- 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
例如,您的 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 更快地对键(和其他元数据)进行操作。
我有一个用例,我必须删除存储在 couchbase 中的实体子集,例如删除键以 "pii_" 开头的所有实体。 我正在使用 NodeJS SDK,但只有一种删除方法一次需要一个键:http://docs.couchbase.com/sdk-api/couchbase-node-client-2.0.0/Bucket.html#remove
在某些情况下,需要删除数千个实体,如果我一个一个地删除它们会花费很长时间,尤其是因为我没有在我的应用程序中保留键列表。
完成此操作的最佳方法是按键创建 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
例如,您的 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 更快地对键(和其他元数据)进行操作。