Удалить несколько сущностей couchbase, имеющих общую комбинацию клавиш
У меня есть случай использования, когда мне нужно удалить подмножество сущностей, хранящихся в базе данных couchbase, например, удалив все сущности с ключами, начинающимися с "pii_". Я использую NodeJS SDK, но есть только один метод удаления, который принимает один ключ за раз: http://docs.couchbase.com/sdk-api/couchbase-node-client-2.0.0/Bucket.html
В некоторых случаях необходимо удалить тысячи сущностей, и это занимает очень много времени, если я удаляю их одну за другой, особенно потому, что я не храню список ключей в своем приложении.
2 ответа
Лучший способ сделать это - создать представление Couchbase по ключу, а затем запросить диапазон по этому представлению через код NodeJS, удалив результаты.
- http://docs.couchbase.com/admin/admin/Views/views-querySample.html
- http://docs.couchbase.com/couchbase-manual-2.0/
- 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_ будут возвращены, и в этом случае вы можете зациклить их и начать удаление.
Лучший,
Я согласен с @ThinkFloyd, когда он говорит: "Удалить на сервере" следует удалять на сервере, а не требовать трех шагов, таких как получение данных с сервера, итерация по ним на стороне клиента и, наконец, повторное удаление каждой записи на сервере снова.
В этом отношении я думаю, что старомодные СУБД были лучше, все, что вам нужно сделать, это "УДАЛИТЬ * из базы данных, где что-то = что-то".
К счастью, в CouchBase есть нечто похожее на SQL, называемое N1QL (произносится как никель). Я не знаю о 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)
Чтобы добиться того же: альтернативный запрос может быть таким, как показано ниже, если вы храните "тип" и / или другие метаданные, например "parent_id".
УДАЛИТЬ из <bucket_name>
где type='Feature' и parent_id=8;
Но я предпочитаю использовать первую версию запроса, так как он работает с ключом, и я считаю, что Couchbase должен иметь некоторые внутренние индексы, чтобы быстрее обрабатывать / запрашивать ключ (и другие метаданные).