我有一个用例,我必须删除存储在couchbase中的实体子集,例如使用以“pii_”开头的键删除所有实体。 我使用的是NodeJS SDK,但只有一种删除方法,一次只需一个密钥:http://docs.couchbase.com/sdk-api/couchbase-node-client-2.0.0/Bucket.html#remove
在某些情况下,需要删除数千个实体,如果我逐个删除它们需要很长时间,特别是因为我没有在我的应用程序中保留键列表。
答案 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,在这种情况下,您可以循环它们并开始删除。
最佳,