Обновление транзакций и удаление документов в ArangoDB - PullRequest
0 голосов
/ 19 июня 2019

Учитывая следующую структуру документа:

{
    "id": "123"
    "traits":
     {
        "abc": 6.5
        "def: 66
     }
}

Мне нужно перебрать документы и удалить некоторые признаки на основе критериев.Документ со всеми удаленными чертами должен быть также удален.

Наконец, мне нужно отслеживать, сколько черт и документов было удалено.

Операции обновления и удаления не должны блокироваться иможет выполняться во время обновления или запроса этих документов.

Я реализовал это в python с помощью python-arango, используя запрос обновления / замены для удаления признаков и запрос удаления для удаления документов без признаков путем выполненияследующие запросы:

FOR some_doc IN some_collection
    FILTER <some filter>
    LET updated_doc = ...
    REPLACE some_doc with updated_doc in some_collection OPTIONS { ignoreRevs: false, ignoreErrors: true }
FOR some_doc IN some_collection
    FILTER LENGTH(some_doc.traits)==0
    REMOVE some_doc in some_collection OPTIONS { ignoreRevs: false, ignoreErrors: true }

Затем я извлекаю статистику из каждого возвращаемого курсора:

cursor = db.aql.execute(remove_traits_query)
stats = cursor.statistics()
modified = stats['modified']

Проблема заключается в том, что мне нужно предотвратить возможность инициирования запроса поиска во время выполнения.описанного выше процесса возвращает документ с пустым объектом признаков до того, как 2-й запрос (т. е. запрос на удаление) будет завершен.

Я попытался реализовать транзакцию, затем вытащил статистику курсора заданий после фиксации следующим образом:

trx_db = db.begin_transaction(write=collection)
traits_removal_job = trx_db.aql.execute(remove_traits_query)
doc_deletion_job = trx_db.aql.execute(delete_query)
trx_db.commit()
stats = traits_removal_job.result().statistics()

, но курсоры заданий транзакции пусты.Я предполагаю, что это потому, что ArangoDB выполняет транзакцию как одну функцию Javascript.

Я мог бы отфильтровать пустые признаки по всем поисковым запросам, но было бы лучше, если бы я мог выполнить вышеупомянутые операции удаления / обновления в одном запросе.(невозможно в ArangoDB для документации ) или в транзакции (без статистики выполнения?).

Есть предложения?

Заранее спасибо!

...