Как я могу обновить срок действия документа в Couchbase, используя Python 3? - PullRequest
0 голосов
/ 17 января 2020

У нас есть много документов в Couchbase с истечением срока действия = 0, что означает, что документы остаются в Couchbase навсегда. Я знаю, что INSERT / UPDATE / DELETE не поддерживается N1QL.

У нас есть 500 000 000 таких документов, и я хотел бы сделать это параллельно, используя куски / массивы. Как я могу обновить поле срока действия, используя Python 3?

Я пытаюсь это:

bucket.touch_multi(('000c4894abc23031eed1e8dda9e3b120', '000f311ea801638b5aba8c8405faea47'), ttl=10)

Однако я получаю сообщение об ошибке типа:

_NotFoundError_0xD (generated, catch NotFoundError): <Key=u'000c4894abc23031eed1e8dda9e3b120'

Ответы [ 2 ]

1 голос
/ 20 января 2020

Я только что попробовал это:

from couchbase.cluster import Cluster
from couchbase.cluster import PasswordAuthenticator
cluster = Cluster('couchbase://localhost')
authenticator = PasswordAuthenticator('Administrator', 'password')
cluster.authenticate(authenticator)
cb = cluster.open_bucket('default')

keys = []
for i in range(10):
    keys.append("key_{}".format(i))

for key in keys:
    cb.upsert(key, {"some":"thing"})

print(cb.touch_multi(keys, ttl=5))

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

Однако, может быть, вы бы действительно предпочли установить срок действия корзины? Это сделает все документы истекает в это время, независимо от того, как истекает срок действия отдельных документов. В дополнение к ответу выше, в котором упоминается, проверьте this для получения более подробной информации.

0 голосов
/ 17 января 2020

Вы можете использовать метод Couchbase Python (Любой) SDK Bucket.touch (). Описанный здесь https://docs.couchbase.com/python-sdk/current/document-operations.html#modifying -expiraton

Если вы не знаете ключи документа, вы можете используйте индекс N1QL Covered, асинхронно извлекайте ключи документов из вашего python SDK и используйте указанный выше срок действия набора API touch bucket из вашего python SDK.

CREATE INDEX ix1 ON  bucket(META().id) WHERE META().expiration = 0;
SELECT RAW META().id 
FROM bucket WHERE META().expiration = 0 AND META().id LIKE "a%";

Вы можете выдавать разные SELECT для разных диапазонов и выполнять параллельно.

Операция обновления, вам нужно написать один. Когда вы получаете каждый ключ, выполняйте (вместо обновления) bucket.touch (), который обновляет только срок действия документа без изменения самого документа. Это позволяет сохранить / получить весь документ (https://docs.couchbase.com/python-sdk/current/core-operations.html#setting -document-expiration ).

...