Это то, что я скоро решу для BlueInk .В настоящее время я использую материализованный путь и планирую использовать MapReduce для динамической генерации карты сайта (полного дерева).
При перемещении ветвей дерева может быть лучше сделать Массовое обновление with "all_or_nothing: true":
Однако ...
все или ничего - чтобы использовать этот режим, включите all_or_nothing: true
как часть запроса.В случае неудачи проверки ни один из документов не будет сохранен.Тем не менее, он не выполняет проверку конфликтов, поэтому все документы будут зафиксированы, даже если это создает конфликты.
... так что вы потенциально можете столкнуться с конфликтами и должны быть уверены, чтоваш validate_doc_update не предотвратил изменение полностью.
Другой альтернативой может быть "в конечном итоге согласиться" с изменением.Вы можете выполнить массовое обновление без all_or_nothing
и продолжать обрабатывать каждый элемент в результатах MapReduce с помощью своего клиентского кода, пока все они не будут перемещены.Это, вероятно, довольно рискованно, учитывая, что кто-то может захотеть отодвинуть его и т. Д.
Независимо от подхода, сохраняющего историю своего прежнего местоположения, может быть разумным, если что-то пойдет не так.* Единственная проблема, с которой я вижу parent_id
, - это количество запросов, которые вам понадобятся для создания полного пути к элементу.Хотя может быть возможно использовать _list
в дополнение к некоторым простым результатам MapReduce, которые используют клавишу [parent_id, _id]
.Построение функции _list
было бы нетривиальным, но должно быть выполнимым.
Я протестировал некоторые из этих подходов, но пока еще не полностью реализован.Если вы сделаете это дальше по любому из этих путей, я хотел бы услышать о вашем прогрессе / результатах.