Firebase .indexOn не работает должным образом - PullRequest
0 голосов
/ 23 июня 2019

У меня есть content узел, который я извлекаю из базы данных Firebase Realtime. Я использую .orderByChild("time"), чтобы получить моментальный снимок данных первых 5 объектов блога, упорядоченных по их самым ранним временным меткам. I

в настоящее время пытается использовать .indexOn : "time" вместо этого, чтобы мне не приходилось использовать .orderByChild("time"), поскольку я ожидаю, что объекты блога уже упорядочены по своей временной метке бэкэндом при их получении. (Я собираюсь работать с очень большим количеством объектов блога, поэтому я хочу использовать .indexOn : "time" в бэкэнде вместо orderByChild("time") в бэкэнде для повышения эффективности). В настоящее время .indexOn не работает, и данные не упорядочены по их временным полям при получении.

запрос без .indexOn

// this works fine
// startAt is utilized for saving last blog object retrieved to retrieve more data

query = 
FirebaseDatabase.getInstance().getReference()
                .child("content")
                .orderByChild("time")
                .startAt(nodeId)
                .limitToFirst(5);

запрос с помощью .indexOn

// this along with the Firebase rules below does not return the same result as above
// startAt is utilized for saving last blog object retrieved to retrieve more data

query = 
FirebaseDatabase.getInstance().getReference()
                .child("content")
                .startAt(nodeId)
                .limitToFirst(5);

Правила Firebase:

{
 "rules": {
 ".read": true,
 ".write": true,
 "content" : {
      ".indexOn": "time"
  }
 }
}

JSON структура данных в Firebase:

"content" : {
"blog-0001" : {
  "content_id" : "blog-0001",
  "image" : "someimage",
  "time" : 13,
  "title" : "title1",
  "type" : "blog"
},
"blog-0002" : {
  "content_id" : "blog-0002",
  "image" : "someimage",
  "time" : 12,
  "title" : "title2",
  "type" : "blog"
},
"blog-0003" : {
  "content_id" : "blog-0003",
  "image" : "someimage",
  "time" : 11,
  "title" : "title3",
  "type" : "blog"
},
"blog-0004" : {
  "content_id" : "blog-0004",
  "image" : "someimage",
  "time" : 15,
  "title" : "title4",
  "type" : "blog"
}
...
}

1 Ответ

2 голосов
/ 23 июня 2019

Вы, похоже, неправильно понимаете, что делает .indexOn и как это связано с orderByChild("time").

Чтобы извлечь дочерние узлы из content, упорядоченного (и, возможно, также отфильтрованного) time, вам всегда нужно будет вызвать orderByChild("time").

Если вы определите индекс (используя ".indexOn": "time"), то упорядочение и фильтрация будут выполняться на сервере.

Без индекса все данные в content будут загружены на клиент, а упорядочение / фильтрация будет выполняться на стороне клиента.

То есть .indexOn не является заменой для orderByChild. Вместо этого они работают рука об руку для эффективного упорядочения и фильтрации данных.

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