Как сохранить отсортированный список в Google Firestore

Как бы вы сохранили упорядоченный список из N элементов в Google Firestore?

Например, список дел. У меня было несколько идей, но ни одна из них не показалась мне умной.

Вы можете поместить ключ «позиция» в элемент, но это потребует обновления значения позиции всех элементов при изменении одного из них.

Вы можете сохранить их в отсортированном массиве и выполнить некоторую склейку перед сохранением.

Мне было бы интересно услышать, каков рекомендуемый подход.


person user2420484    schedule 15.03.2018    source источник


Ответы (2)


Вы можете хранить два списка в Firestore. Один с вашими фактическими данными (неупорядоченными), а другой с картой id для заказа.

Вот пример Дарта:

main() {

  List myList = [
    {'id': 'red', 'test': 'some data'},
    {'id': 'green', 'other': 'some other data'},
    {'id': 'blue'},
  ];

  List myOrderList = ['green', 'red', 'blue'];

  List orderByOtherList(List theList, String commonField, List orderList) {
    List listOut = [];
    orderList.forEach((o) => listOut.add(theList.firstWhere((m) => m[commonField] == o)));
    return listOut;
  }

  print(myList);
  print(orderByOtherList(myList, 'id', myOrderList));
}

Вот пример на DartPad: https://dartpad.dartlang.org/dc77acd6e4cfce608796a51cda3ee9ad

Затем объедините потоки с помощью combLatest2 из rxdart, чтобы упорядочить фактический список в вашем приложении при каждом изменении любого из списков.

В этом примере используется Dart, но вы сможете создать что-то подобное и на других языках.

person Simpler    schedule 06.03.2019

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

person Doug Stevenson    schedule 15.03.2018
comment
Спасибо, я уже думал. Просто сохраните отсортированный массив как поле в документе и обновляйте его каждый раз. - person user2420484; 19.03.2018
comment
Это кажется плохим подходом, учитывая, что вы платите за каждую запись документа. В примере списка дел OP каждое изменение порядка элемента списка дел соответствует порядку записи N документов в Firestore. Это не только займет время, это будет стоить дорого. - person Patrick; 06.12.2018
comment
Хотел бы я иметь один. К сожалению, я думаю, что лучший подход должен быть реализован командой Firestore. - person Patrick; 06.12.2018
comment
@Patrick Вы также можете подать запрос на функцию. firebase.google.com/support/contact/bugs-features - person Doug Stevenson; 06.12.2018