Несколько индексов для коллекции - только одна работа - PullRequest
0 голосов
/ 22 марта 2019

Во-первых, я новичок в базе данных Firebase и пришел из SQL фона.

Я пытаюсь получить запрос, который возвращает все уведомления для указанного postID независимо от того, для какого пользователя предназначено уведомление.

По сути, если кто-то удаляет свое сообщение, я хочу удалить все уведомления о "новых сообщениях", отправленные всем его подписчикам.

Моя структура данных enter image description here

Я пробовал эти индексы ..

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "notification": {
      "$user_id": {
            ".indexOn": ["timestamp", "objectId"]
      }
    }
  }
}

Я могу запросить timestamp с помощью следующего кода, и он отлично работает.

 dbRef.GetChild("notificaton").GetChild(userID).GetQueryOrderedByChild("timestamp");

Однако я не хочу использовать userID в своем запросе для почтовых уведомлений. Я искал и попробовал несколько других конфигураций для индекса, но я просто получаю ошибки в администраторе базы данных Firebase, что есть проблемы с моими индексами.

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

Я не уверен, как индекс должен быть настроен для возможности запроса на objectId независимо от user_id.

Я тоже пробовал что-то подобное ..

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "notification": {
        ".indexOn": ["objectId"]
    },
    "notification": {
      "$user_id": {
        ".indexOn": ["timestamp"]
      }
    }
  }
}

но я получаю ошибку Error saving rules: 'notification' occurs multiple times.

Я пробовал это ..

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "notification": {
      "$user_id": {
        ".indexOn": ["timestamp"]
      },
      ".indexOn": ["objectId"]
    }
  }
}

И Firebase, кажется, в порядке с этим, поскольку он не выдает ошибку, но также не возвращает никаких данных, что, как я полагаю, связано с тем, что objectId не находится в корневой коллекции notification.

Так что я застрял.

1 Ответ

2 голосов
/ 22 марта 2019

Если вы хотите добавить индексы для каждого пользователя как timestamp, так и objectId каждого из их дочерних узлов, вы можете сделать это с помощью:

{
  "rules": {
    "notification": {
      "$user_id": {
        ".indexOn": ["objectId", "timestamp"]
      }
    }
  }
}

Это позволяет запрашивать у пользователя дочерние узлы с соответствующим objectId или запрашивать у пользователя дочерние узлы на основе отметки времени.


Запросы Firebase всегда возвращают прямые дочерние узлы местоположения, в котором вы их выполняете. Это означает, что предложение orderByChild() запроса должно ссылаться на фиксированный путь к одному свойству каждого прямого дочернего узла. Другими словами: вы не можете запросить дерево.

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

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