база данных реального времени firebase .orderByChild не возвращает правильный порядок - PullRequest
1 голос
/ 15 января 2020

Я использую firebase и хочу упорядочить свои результаты по quoteID. Однако orderbychild не возвращает первый или последний элемент из списка, как ожидалось.

this.props.firebase.db.ref('quotes').orderByChild("quoteId").limitToFirst(1).once("value", snapshot => {
  const entry = snapshot.val();

  console.log(entry);


})

моя структура данных выглядит следующим образом:

{
  "1ec658d2-a7cb-45b8-8d9b-9c2a6783365d" : {
    "dateCreated" : "2019-12-02T16:06:50+01:00",
    "owner" : "DVRVSpeOXQV6wAmHAdpAe6iPQ5i2",
    "quoteID" : "200115001",
    "timeStamp" : 2075985276
  },
  "3e95a6ba-df85-4dbb-97b0-cf36df068bc1" : {
    "dateCreated" : "2019-09-27T09:17:58+02:00",
    "owner" : "xZBFCq4ho3V2G8dZTvK7RjsnTr43",
    "quoteID" : "200115002",
    "timeStamp" : 1
  },
  "d95d1f32-804b-4625-8f7e-e0bfb4f032e6" : {
    "dateCreated" : "2019-12-10T14:39:40+01:00",
    "projectName" : "testPropject timestamp2",
    "quoteID" : "191210000",
    "timeStamp" : 1575985180
  }
}

Я получаю запись с qouteID '200115001', возвращенную как первый отдельный элемент. Я не могу понять, почему «191210000» не возвращается первым в лексографическом порядке, как описано в документации

https://firebase.google.com/docs/database/web/lists-of-data#data -заказ

1 Ответ

0 голосов
/ 15 января 2020

Снимок, который вы получаете из Firebase, содержит 3 фрагмента информации для каждого соответствующего дочернего узла:

  1. Его ключ.
  2. Его значение.
  3. Его относительное положение в другие возвращенные дочерние узлы.

Когда вы вызываете snapshot.val(), эти данные преобразуются в простой JSON объект. И в этом объекте есть место только для двух из этих частей информации: ключ и значение. Порядок ключей в JSON объекте не определен, поэтому порядок результатов теряется при вызове snapshot.val().

. Для поддержания порядка итерируйте дочерние узлы с помощью snapshot.forEach(). Примерно так:

this.props.firebase.db.ref('quotes').orderByChild("quoteId").limitToFirst(1).once("value", snapshot => {
  snapshot.forEach((child) => {
    console.log(child.key);
    console.log(child.val());
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...