Firebase orderByKey() противоречивый порядок ключей

Есть некоторые бизнес-требования, которым я должен соответствовать, и мои ключи частично создаются веб-интерфейсом Firebase (например, -JzuZoAtZ9fKY9z3GbEU) частично вручную (например, 304810429574385)

Версия Firebase, которую я использую: "version": "2.2.7"

я использую orderByKey() запрос для сортировки предметов и как указывает документация:

  1. Сначала идут дочерние элементы с ключом, который может быть проанализирован как 32-разрядное целое число, отсортированные по возрастанию.
  2. Далее следуют дети со строковым значением в качестве ключа, отсортированные лексикографически в порядке возрастания.

Может ли кто-нибудь дать мне некоторое представление о том, почему ключи, сгенерированные в Firebase, не обрабатываются как обычные строки, а их расположение кажется непредсказуемым, как если бы они были числами?

Примеры отсортированных ключей у меня есть для двух отдельных конечных точек:

// case no 1
-JzLOQGFCw6ZwHnQZPFR
-JzuZoAtZ9fKY9z3GbEU
163467300371184
222032364474376
386146869432

// case no 2
222441849
225215973
225484186
-JzpekQUr7jRDHo5qk3D

Ссылки на случаи данных Firebase ПЕРВЫЙ и ВТОРОЙ

JSfiddle orderByKey() использование.

Предыдущий вывод был напечатан с использованием:

var keys = [];
fireRef.orderByKey().on('child_added',function(snap){
    keys.push(snap.key());
});

То же самое при получении данных через REST API, при заказе с orderBy="$key":

GET https://my_app.firebaseio.com/one/two/three.json?orderBy="$key"&auth=superSecret

То же самое при использовании angularfire:

$scope.items = $firebaseArray(fireRef.orderByKey());

1 ответ

Решение

Числа в вашем случае 1 больше, чем вписывается в 32-разрядное целое число: 2147483647

Более очевидно, что произойдет, если вы объедините два списка:

222441849
225215973
225484186
-JzLOQGFCw6ZwHnQZPFR
-JzuZoAtZ9fKY9z3GbEU
163467300371184
222032364474376
386146869432

Числа перед идентификаторами push (клавиши, начинающиеся с -J) упорядочены по числовым значениям. Числа после push-идентификаторов не помещаются в 32-разрядное целое число и, следовательно, (как описано в цитируемом документе) упорядочены по их лексикографическому значению.

Другие вопросы по тегам