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

4

我正在开始使用Cloud Firestore,但卡在这里了。

我正在寻找一个where查询,以返回值>=限制的值。

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

我在云函数中使用 Firebase Admin Python SDK。有什么提示吗?

2
请添加您的数据库结构截图,这是为Android、iOS还是Web? - Alex Mamo
最后一个问题,您想获取所有limit属性值>= value属性值的文档。在您的示例中,结果应该是单个文档,即最后一个文档,因为95 >= 90,对吗? - Alex Mamo
无论哪种方式...但让我们先处理所有价值属性大于或等于价值属性值的文档,即前两个。 - Kubber
我不知道伙计们我可以多少次重复相同的东西,我开始担心我会因为太多评论而被 SO 禁止使用 ;) 不管是 <= 还是 >= 的比较方式,都无关紧要,但为了跟我的问题和答案保持一致,所有 'value' >= 'limit' 的文档,所以前两个。 - Kubber
好的,我会立即给您写一份答案。 - Alex Mamo
显示剩余10条评论
2个回答

5

如Alex所解释的那样,在执行Firestore查询时,没有比较两个文档字段值的方法。

一个可能的方法是,在保存文档时将不等式的结果保存到数据库中。如果您在保存“检查”文档时知道了这两个值(limitvalue),则可以添加第三个字段,例如valueAboveLimit,其值为TrueFalse,您可以在保存“检查”文档时进行计算(即使用相应的客户端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()

如果您保存Firestore文档时没有limitvalue的值(例如稍后编写limit字段),则可以使用云函数触发器在Firestore文档更改时触发,并且如果这两个字段存在,则计算并保存valueAboveLimit字段。


1
非常好的方法,Renaud! - Alex Mamo
谢谢Alex,谢谢Renaud - “在使用Firestore执行查询时,无法比较两个文档字段的值” - 这就是我想确认的全部内容。我可以在客户端解决我的问题,但还是感谢Renuad! - Kubber

1
根据之前的评论,您正在寻找一种方法来查询数据库,以便它只返回limit属性的值大于或等于value属性的值的文档。因此,根据您的示例,期望的结果应该是第一个和第二个文档。
不幸的是,Firestore目前没有内置的查询可以帮助您实现这一点。我能想到的最简单的解决方案是获取checks集合中的所有文档,并在客户端过滤结果。如果您的集合中有大量文档,这可能不是最佳解决方案,因为它需要读取所有文档。这意味着您会因读取每个文档而被收取一次读取操作费用。
另一种解决方案可能是使用limit属性的固定值,并使用where()调用查询数据库:
col_checks.where('limit', '>=', your_limit)

每次需要新的限制时,您都需要创建一个新的查询。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接