Как .indexOn работает с пользователями и уникальными ключами? - PullRequest
0 голосов
/ 14 февраля 2020

Я запутался с правилами индекса в firebase. У меня есть эта база данных, и я хотел извлечь distance_traveled в battery_and_cables. Дело в том, что 1 - это что-то вроде идентификатора пользователя, установленного самим пользователем, поэтому он будет различаться

Я использовал этот код в pyrebase для извлечения distance_traveled

db.child("mileage_maintenance").order_by_child("distance_traveled").get()

, но я получаю

Индекс не определен, добавьте ".indexOn": " distance_traveled ", для пути" / micycle_maintenance ", к правилам

Это моя база данных:

This is my database

Любые мои правила:

{
  "rules": {
    ".read": true,
    ".write": true,
    "mileage_maintenance": {
      "battery_and_cables":{
        ".indexOn": ["distance_traveled"]
       }
    },
  }
}

Можно ли как-нибудь go через 1 и клавишу push получить distance_traveled?

1 Ответ

0 голосов
/ 14 февраля 2020

База данных Firebase Realtime Запросы работают с простым списком узлов в месте, где вы выполняете запрос . Поэтому в вашем случае в запросе учитываются прямые дочерние элементы узла mileage_maintenance (который на скриншоте является просто узлом 1).

В ваших правилах можно использовать символы подстановки, как в вашем случае:

{
  "rules": {
    ".read": true,
    ".write": true,
    "mileage_maintenance": {
      "$id": {
        "battery_and_cables":{
          ".indexOn": ["distance_traveled"]
         }
      }
    }
  }
}

Как видите, я добавил здесь уровень $id для узла 1. Теперь это означает, что у вас есть индекс, определенный на каждом узле /mileage_maintenance/$id/battery_and_cables для свойства distance_traveled каждого дочернего узла под этим.

Таким образом, с этим индексом вы можете запросить конкретный c /mileage_maintenance/$id/battery_and_cables путь для значений distance_traveled. Но вы не можете выполнить запрос только на /mileage_maintenance для всех значений distance_traveled под ним.

Если вам нужен такой запрос, вам потребуется изменить / дополнить модель данных, чтобы разрешить его. Например, введя плоский список distance_traveled узлов, которые можно затем запросить:

"distance_traveled": {
   "1000000": "1/battery_and_cables/-M01CT...1hMj"
}

или

"distance_traveled": {
   "1~battery_and_cables~-M01CT...1hMj": 1000000
}

, где ~ в этой последней модели является просто отдельно для сегментов в этом ключе, так как / не допускается.

Также см .:

...