通过比较两个文档的字段值来定义Firestore查询

时间:2019-10-07 11:38:17

标签: python firebase google-cloud-firestore google-cloud-functions

我正在Cloud Firestore上迈出第一步,而我仍然坚持这一步。 我正在寻找一个where查询,以返回>=极限值。

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

我正在Cloud Function中使用Firebase Admin Python SDK。

有任何提示吗?

2 个答案:

答案 0 :(得分:2)

正如Alex所解释的那样,使用Firestore执行查询时无法比较两个文档的字段值。

一种可能的方法是将文档保存到数据库时保存不等式的结果。如果在保存“检查”文档时知道两个值(limitvalue),则可以添加第三个字段,例如valueAboveLimit,其值为{ {1}}或True是您在保存“检查”文档时所计算的(即从前端使用相应的客户端SDK或从服务器使用Firebase Admin Python SDK,具体取决于您的编写方式Firestore文件)。

那么您的查询将很容易:

False

如果在保存Firestore文档时没有database = firestore.client() col_checks = database.collection('checks') query_checks = col_checks.where('valueAboveLimit', '==', True) results = query_checks.get() limit的值(例如,稍后会写value字段),可以使用when the Firestore document is changed触发的Cloud Function,如果存在两个字段,则计算并保存此limit字段。

答案 1 :(得分:1)

根据前面的注释,您正在寻找一种查询数据库的方法,以便它只能返回limit属性值为>=而不是{{ {1}}属性。因此,根据您的示例,预期结果应该是第一个文档和第二个文档。

不幸的是,Firestore当前没有内置查询可以帮助您实现这一目标。我能想到的最简单的解决方案是获取value集合中的所有文档,并在客户端过滤结果。如果您的馆藏中有大量文档,这可能不是最好的解决方案,因为它需要读取所有文档。这意味着您要为每个阅读的文档执行一次阅读操作。

另一种解决方案可能是对checks属性使用固定值,并使用limit调用查询数据库:

where()

每当您需要一个新的限制时,就必须创建一个新的查询。