Удалить несколько сущностей couchbase, имеющих общую комбинацию клавиш

У меня есть случай использования, когда мне нужно удалить подмножество сущностей, хранящихся в базе данных couchbase, например, удалив все сущности с ключами, начинающимися с "pii_". Я использую NodeJS SDK, но есть только один метод удаления, который принимает один ключ за раз: http://docs.couchbase.com/sdk-api/couchbase-node-client-2.0.0/Bucket.html

В некоторых случаях необходимо удалить тысячи сущностей, и это занимает очень много времени, если я удаляю их одну за другой, особенно потому, что я не храню список ключей в своем приложении.

2 ответа

Решение

Лучший способ сделать это - создать представление 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_ будут возвращены, и в этом случае вы можете зациклить их и начать удаление.

Лучший,

Я согласен с @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 должен иметь некоторые внутренние индексы, чтобы быстрее обрабатывать / запрашивать ключ (и другие метаданные).

Другие вопросы по тегам