Firestore - Python фильтр по значению в списке - PullRequest
1 голос
/ 10 июля 2020

Здесь у меня есть данные, хранящиеся в Firestore, и у меня есть ключ timeslots, в котором хранится список JSON, который я хотел бы фильтровать по строковому значению (например, 3 AM (EST), 4 AM (EST)) непосредственно из Firebase. Обычно я могу сделать следующее в Python:

from google.cloud import firestore

db = firestore.Client()
ref = db.collection('submissions')
submissions = []
for idx, doc in enumerate(ref.stream()):
    submission = doc.to_dict()
    submission['id'] = doc.id
submissions.append(submission)

, где submissions - это список, который выглядит примерно так:

[{'submission_date': DatetimeWithNanoseconds(2020, 7, 10, 20, 58, 9, 330598, tzinfo=<UTC>),
  'title': 'Testing submission',
  'authors': ['Mr. A', 'Mr. B'],
  'timeslots': ['3 AM (EST)', '4 AM (EST)'],
  'abstract': 'No abstract here',
  'id': '12345'},
 {'submission_date': DatetimeWithNanoseconds(2020, 7, 10, 20, 58, 9, 330598, tzinfo=<UTC>),
  'title': 'Testing submission 2',
  'authors': ['Mr. C', 'Mr. D'],
  'timeslots': ['4 AM (EST)', '5 AM (EST)'],
  'abstract': 'No abstract here too',
  'id': '123456'},
  ...
 ]

Обычно я делаю следующее, чтобы время фильтрации == 3 AM (EST) в данном случае:

submissions_filtered = [
    submission for submission in submissions
    if '3 AM (EST)' in submission.get('timeslots', '')
]

Я не уверен, смогу ли я сделать это прямо из Firestore stream (или чего-то еще). Если бы кто-то знал, было бы здорово.

1 Ответ

2 голосов
/ 10 июля 2020

Если вы хотите отфильтровать документы на основе некоторой строки в поле типа массива, вы можете использовать запрос «array-contains», как показано в документации .

ref = db.collection('submissions').where('timeslots', 'array_contains', '3 AM (EST)')
...