Учитывая следующую структуру документа:
{
"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 для документации ) или в транзакции (без статистики выполнения?).
Есть предложения?
Заранее спасибо!