Порядок сортировки в массивах Firestore - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь понять массивы в Firebase немного больше.В настоящее время я храню карты в массивах, где одним из полей внутри карты является position, которое я могу использовать в своем мобильном приложении для сортировки массива при извлечении и отображения результатов в порядке position.

Документы на Firebase говорят:

Массивы сортируются по элементам.Если элементы равны, массивы сортируются по длине.

Например, [1, 2, 3] <<code>[1, 2, 3, 1] <<code>[2].

А затем есть раздел, описывающий, как картысортируются также:

Порядок ключей всегда сортируется.Например, если вы пишете {c: "foo", a: "bar", b: "qux"}, карта сортируется по ключу и сохраняется как {a: "foo", b: "bar", c: "qux"}.

Поля карты сортируются по ключу и сравниваются по парам ключ-значение, сначала сравниваются ключи, а затем значения,Если первые пары ключ-значение равны, сравниваются следующие пары ключ-значение и т. Д.Если две карты начинаются с одинаковых пар ключ-значение, то учитывается длина карты.Например, следующие карты расположены в порядке возрастания:

{a: "aaa", b: "baz"}
{a: "foo", b: "bar"}
{a: "foo", b: "bar", c: "qux"}
{a: "foo", b: "baz"}
{b: "aaa", c: "baz"}
{c: "aaa"}

Но затем я попытался сделать это в Firestore: я перемешал порядок карт в приведенном выше примере и сохранил их в массиве:

data= [{"c": "aaa"}, {"a": "aaa", "b": "baz"}, {"a": "foo", "b": "baz"}, {"b": "aaa", "c": "baz"}, {"a": "foo", "b": "bar", "c": "qux"}, {"a": "foo", "b": "bar"}]

И после вставки в документ Firestore массив не сортировался!Хотя сами ключи сортируются в пределах одной карты, элементы в массиве остаются в том же порядке.

Так работает ли сортировка в массивах, даже если элементы являются картами?Вот пример того, что я храню в Firestore:

{
    "car_collection": {
        "models": {
            data: [
                {
                    "model": "Honda",
                    "color": "black",
                    "position": 0
                },
                {
                    "model": "Hyundai",
                    "color": "red",
                    "position": 1
                },
                {
                    "model": "Chevrolet",
                    "color": "yellow"
                    "position": 2
                }
            ]
        }
    }
}

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

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Отправил тикет в Google, чтобы улучшить документацию для типа Array, и я думаю, что это полезно и точно, как видно из тестов дыма.

https://firebase.google.com/docs/firestore/manage-data/data-types

Копирование и вставка текущеговерсия здесь:

Массив не может содержать другое значение массива в качестве одного из его элементов.

В массиве элементы сохраняют назначенную им позицию.При сортировке двух или более массивов массивы упорядочиваются по значениям их элементов.

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

Например, [1, 2, 3] < [1, 2, 3, 1] < [2].Массив [2] имеет наибольшее значение первого элемента.Массив [1, 2, 3] имеет элементы, равные первым трем элементам [1, 2, 3, 1], но он короче по длине.

Таким образом, вы можете с уверенностью ожидать, что порядок элементов будет сохранен в Firestore, в то время какпонимание эффектов добавления / удаления.

0 голосов
/ 11 февраля 2019

Вам придется отсортировать ваш массив перед отправкой в ​​Firestore.Массивы не сортируются ни в RTD, ни в объектах Firestore, однако сортируются по ключам.Или сортируйте массивы на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...