Как я могу создать коллекцию в Cloud Firestore, которая может быть переупорядочена пользователем без написания каждого документа? - PullRequest
0 голосов
/ 04 февраля 2020

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

Я хочу, чтобы пользователь мог перетаскивать и изменять порядок списка и сохранять его таким образом. Первоначально я думал, что поле должно быть изменено, чтобы отражать этот порядок, но перемещение одного объекта требует изменения значения в каждом документе после нового местоположения.

Есть ли способ достичь этого без огромного количества записей?

Ответы [ 3 ]

1 голос
/ 04 февраля 2020

Если порядок документов часто меняется, вы можете избежать записи содержимого каждого документа, вместо этого используя совершенно другой документ для поддержания порядка, используя массив строк, содержащий идентификаторы документов. Фактически, вы можете хранить много разных заказов в зависимости от того, как вы хотите отобразить документы.

Допустим, у вас есть коллекция документов:

collection
  - docA
  - docB
  - docC

Теперь вы хотите хранить изменяемые заказы в документе под названием «заказ» в другой коллекции:

collection-meta
  - order
    - byAlpha: ["docA", "docB", "docC"]
    - byScore: ["docC", "docA", "docB"]

Просто сначала запросите документ «заказ», а затем получите каждый документ для отображения в порядке, определенном в массиве. Чтобы изменить порядок документов, просто обновите содержимое одного массива в «порядке», сделайте c.

0 голосов
/ 04 февраля 2020

Обычно я делаю это, используя для заказа значение с плавающей запятой.

Скажем, у вас есть список с этими 3 документами:

  • ID = a, order = 1.0
  • ID = b, order = 2.0
  • ID = c, order = 3.0

Теперь давайте предположим, что мы хотим переместить документ a между b и c. Это можно сделать, изменив его порядок на 2.0 + (3.0 - 2.0) / 2 = 2.5.

  • ID = b, order = 2.0
  • ID = a, order = 2.5
  • ID = c, заказ = 3,0

Это работает для разумного количества свопов, с которым я обычно имею дело.

Если вы имеете дело с большим числом / потенциально бесконечным числом итераций вы захотите посмотреть на точность операции с плавающей запятой. В этом случае альтернативой может быть использование пользовательского типа значения, то есть кодирование значения в строковое поле, а затем использование пользовательской библиотеки для выполнения деления с более высокой точностью c.

0 голосов
/ 04 февраля 2020

Если я правильно понял ваш вопрос, то вы можете сделать следующее: у вас может быть отдельный документ, содержащий указатель всех остальных документов контрольного списка. Все контрольные документы могут хранить соответствующую информацию, как и должно быть. Например,

Checklist1                  Checklist3           
Checklist2                  Checklist2
Checklist3                  Checklist1
Index                       Index
(Before)                    (After Drag)

и индекс содержит структуру, подобную приведенной ниже, после выполнения перетаскивания:

  Index   ->   field         value  
               Checklist1    3  
               Checklist2    2
               Checklist3    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...