Я ищу хороший способ реализации ключа сортировки, который полностью определяется пользователем. Например. Пользователь представлен списком и может сортировать элементы, перетаскивая их. Этот порядок должен быть сохранен.mongodb: моделирование пользовательского порядка сортировки
Один из часто используемых способов является просто создать поле типа сортировки по возрастанию целое в пределах каждого элемента:
{
"_id": "xxx1",
"sort": 2
},
{
"_id": "xxx2",
"sort": 3
},
{
"_id": "xxx3",
"sort": 1
}
Хотя это, конечно, работать, он не может быть идеальным: В случае, если пользователь перемещает элемент из очень низкое до самого верха, все промежуточные индексы должны обновляться. Мы здесь не говорим о встроенных документах, поэтому это приведет к обновлению многих отдельных документов. Это может быть оптимизировано путем создания начальных значений сортировки с промежутками между ними (например, 100, 200, 300, 400). Однако это создаст необходимость в дополнительной логике повторной сортировки в случае исчерпания пространства между двумя элементами.
На ум приходит еще один подход: наличие родительского документа содержит отсортированный массив, который определяет порядок детей.
{
"_id": "parent01",
"children": ["xxx3","xxx1","xxx2"]
}
Такой подход, безусловно, сделает его легче изменить порядок, но будет иметь это собственные предостережения: Родительские документы всегда должны следить за правильный список своих детей. Поскольку добавление детей будет обновлять несколько документов, это все еще может быть не идеальным. И должна быть сложная проверка входных данных, полученных от клиента, поскольку длина этого списка и содержащихся в нем элементов никогда не может быть изменена клиентом.
Есть ли лучший способ реализовать такой вариант использования?
Второй вариант кажется мне более эффективным и выполнимым. Что вы подразумеваете под комплексной проверкой ввода, полученной от клиента? »Если вы просто хотите проверить, использует ли клиент действительные элементы, вы можете иметь вторую отдельную коллекцию с только допустимыми элементами для проверки этого. Кроме того, mongodb будет вскоре появится опция «вставить по индексу» (https://jira.mongodb.org/browse/SERVER-2363). – joao
Спасибо, эта проблема возникла бы только в том случае, если клиенту будет разрешено отправлять обновленные если клиент отправляет необходимые шаги для воссоздания обновленного списка. Однако, вероятно, вы должны отправить этот комментарий в качестве ответа. –