2015-06-16 1 views
0

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

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

ответ

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

Бест,

+0

Это означает, что мы получаем ключи навалом, но снова мы удаляем все объекты один за другим с помощью цикла.Если у меня есть 10000 + сущностей, то этот цикл for-loop будет бомбардировать сервер couchbase с помощью множества параллельных запросов вместо отправки всех ключей в списке и позволить couchbase удалять все из них внутри. Не будут ли эти многочисленные запросы влиять на другие запросы, которые увольняются приложением для других случаев использования? Не могу ли я УДАЛИТЬ использовать представления? – ThinkFloyd

+0

Hey @ThinkFloyd, У вас есть веская забота, однако, что Couchbase Server работает так же эффективно, как и NodeJS, асинхронный, на самом деле это не проблема. Каждый удаляемый вами номер в NodeJS будет неблокироваться, поэтому прикладной уровень не будет заблокирован. Когда запрос удаления удаляется на Couchbase Server, документ затем помечен для удаления, а затем удаляется, когда происходит уплотнение. Вы не можете удалять данные напрямую. Я бы не стал слишком беспокоиться об этом, но дайте мне знать, если у вас возникнут дополнительные вопросы. Лучший, –

+0

Можно ли удалить все объекты в ведро? Что-то вроде 'TRUNCATE Table XYZ'. Если это возможно, я могу объединить все свои ключи в одном ковше и продуть его, когда это необходимо. – ThinkFloyd

2

Я согласен с @ThinkFloyd, когда он говорит: Удалить на сервере должен быть удалять на сервере, а не требует трех шагов, как получить данные с сервера, перебрать его на стороне клиента, и, наконец, для каждого снова удалите запись на сервере.

В этом отношении, я думаю, что старомодные РСУБД были лучше всего, что вам нужно сделать, это «УДАЛИТЬ» из базы данных, где что-то = что-то ».

К счастью, в CouchBase, называемом N1QL (произносится как nickle), есть что-то похожее на SQL. Я не знаю о JavaScript (и синтаксисе другого языка), но это то, как я это сделал в python.

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