Определение запроса Firestore путем сравнения значений двух полей документа - PullRequest
1 голос
/ 07 октября 2019

У меня есть первые шаги в Cloud Firestore, и я застрял на этом. Я ищу запрос where, чтобы вернуть мне значения, которые >= предел.

  [{
    'limit': 100,
    'value': 200 
  }, 
  {
    'limit': 50,
    'value: 50,
  },
  {
    'limit': 95,
    'value': 90, 
  }]

Я использую Firebase Admin Python SDK в облачной функции.

Любые подсказки

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Как объяснил Алекс, невозможно выполнить сравнение двух значений полей документа при выполнении запроса с помощью Firestore.

Один из возможных подходов - сохранить результат неравенства при сохранении документа вбаза данных. Если при сохранении «проверочного» документа вам известны два значения (limit и value), вы можете добавить третье поле с именем, например, valueAboveLimit со значением True или Falseто, что вы рассчитываете при сохранении «проверочного» документа (т.е. из вашего внешнего интерфейса с соответствующим клиентским SDK или с сервера с Firebase Admin Python SDK, в зависимости от того, как вы пишете документы Firestore).

Тогда ваш запрос будет простым:

database = firestore.client()
col_checks = database.collection('checks')
query_checks = col_checks.where('valueAboveLimit', '==', True)
results = query_checks.get()

Если у вас нет значений limit и value на момент сохранения документа Firestore(например, поле limit будет написано позже), вы можете использовать облачную функцию, которая запускается при изменении документа Firestore и, если два поля присутствуют, вычисляет и сохраняет это valueAboveLimitполе.

1 голос
/ 07 октября 2019

Согласно предыдущим комментариям, вы ищете способ, которым вы можете запросить базу данных, чтобы она могла возвращать только те документы, у которых значение limit свойства равно >=, чем значение value свойства. Итак, согласно вашему примеру, ожидаемый результат должен быть первым и вторым документом.

К сожалению, в настоящее время в Firestore нет встроенного запроса, который мог бы помочь вам достичь этого. Самое простое решение, которое я могу придумать, - это собрать все документы в вашей коллекции checks и отфильтровать результаты на стороне клиента. Если у вас в коллекции большое количество документов, это может быть не лучшим решением, так как для этого необходимо прочитать все документы. Это означает, что вам выставляется одна операция чтения для каждого прочитанного документа.

Другое решение может заключаться в использовании фиксированного значения для свойства limit и запросе базы данных с помощью вызова where():

col_checks.where('limit', '>=', your_limit)

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

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