Запрос по элементу массива и другим полям одновременно в Firestore - PullRequest
0 голосов
/ 13 мая 2018

Мне пришлось перефразировать этот вопрос, поскольку он немного вводил в заблуждение (моя вина).

Вот моя дилемма, допустим, у меня есть коллекция партий:

parties {
  status: "open",
  invitees: [56486,68978,897650], # user ids of invited users
  scheduled_at: 1948089050 # timestamp
}

I 'Я хотел бы запрашивать только «открытые» стороны, на которые меня пригласили (мой идентификатор пользователя в массиве сериалов) и отсортированные по scheduled_at

. Я мог решить первую часть запроса к массиву, повернувэто в хеш (благодаря @renaud и @james poag) :

parties {
  status: "open",
  invitees: {
    56486: true,
    68978: true,
    897650: true
  }
  scheduled_at: 1948089050
}

Теперь выполняем это:

db.collection('parties').where('status', '==', 'open').where('invitees.56486', '==', true').orderBy('scheduled_at')

Результатыв ошибке Firebase попросил меня составить индекс для status + invitees.56486 + scheduled_at.как вы видите, для меня нецелесообразно добавлять индекс для каждого идентификатора пользователя.

Есть идеи?

1 Ответ

0 голосов
/ 13 мая 2018

Похоже, вы пытаетесь сделать запрос по схеме, которая на самом деле не поддерживает этот запрос.Вам нужно будет скорректировать свою схему (возможно, дублируя данные между коллекциями) для поддержки вашего предполагаемого запроса.Такая практика нормальна для баз данных типа NoSQL.

Вам понадобится новая коллекция, которая связывает одну сторону с одним приглашенным, по одному на каждую комбинацию, которая фактически служит «объединением» междуих:

party-invitees
  - party_id
  - party_status ("open")
  - party_scheduled_at
  - attendee_id

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

db.collection('party-invitees')
    .where('party_status', '==', 'open')
    .where('attendee_id', '==', 'whatever')
    .orderBy('party_scheduled_at')

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

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