关于使用位置参数进行过滤的 Firestore 警告。如何在 Firestore 查询中使用'filter' kwarg?

回答 3 浏览 1404 2023-04-26

Firestore开始显示

UserWarning: Detected filter using positional arguments. Prefer using the 'filter' keyword argument instead.

当使用query.where(field_path, op_string, value)时,它是官方文档中的方法,https://cloud.google.com/firestore/docs/query-data/queries

那么,我们应该如何使用 "filter"这个术语呢?找不到这方面的文档或样本。

UPDATE:在GitHub上有一个关于这个问题的公开问题https://github.com/googleapis/python-firestore/issues/705(谷歌的人没有任何反应)。

更新2:所以,基本上,它应该是这样的

from google.cloud.firestore import CollectionReference
from google.cloud.firestore_v1.base_query import FieldFilter, BaseCompositeFilter

...

conditions = [[field, operator, value], [field, operator, value], ...]
query = CollectionReference(path1, path2, path3, ...)

query = query.where(filter=BaseCompositeFilter('AND', [FieldFilter(*_c) for _c in conditions]))

对于一个FieldFilter操作符,通常==,!=等工作,如这里所规定的 https://firebase.google.com/docs/firestore/query-data/queries#query_operators

你也可以用'OPERATOR_UNSPECIFIED'代替'AND',但我不确定它是否能起到我认为应该起到的作用 https://firebase.google.com/docs/firestore/reference/rest/v1/StructuredQuery#Operator

syldman 提问于2023-04-26
也看到了这些新的警告zetyquickly 2023-04-28
正如__doc__所说,当"*位置参数和关键字参数filter都被传递时,它就会被提出来;zetyquickly 2023-04-28
这是ValueError "Can't pass in both the positional arguments and 'filter'at the same time",它停止执行query.where()允许positional和kwargs,但用positional就开始引发UserWarning。看起来Firestore正在向kwargs发展,但忘记了更新文档。syldman 2023-04-30
在Github上有一个关于它的公开问题github.com/googleapis/python-firestore/issues/705syldman 2023-04-30
3 个回答
#1楼 已采纳
得票数 6

根据@Robert G出色的回答,你可以通过一个半小的调整来摆脱这个警告。

代替:

query = collection_ref
query = query.where(field, op, value)

用这个:

from google.cloud.firestore_v1.base_query import FieldFilter
query = collection_ref
query = query.where(filter=FieldFilter(field, op, value))

然后警告就消失了。希望这有帮助

Neil C. Obremski 提问于2023-05-19
接受这一点,尽管它缺乏一个例子,而这是非常必要的,因为谷歌'忘了'在他们的文档中包括一个例子。syldman 2023-05-22
而对于多个条件,它应该是复合过滤器firebase.google.com/docs/firestore/reference/rest/v1/…syldman 2023-05-22
#2楼
得票数 1

正如之前在评论中发布的,目前在Github中发布了一个持续的问题。对于那些遇到类似问题的人来说,他们可以查看这个Github链接,了解关于这个问题的更新。

此外,你也可以申请一个bug,这样谷歌的开发人员/工程师也可以对此进行检查,并提供即时的解决方案/修复。

你可以通过这些链接提交一个bug:

我希望这对你有帮助。

Robert G 提问于2023-05-02
#3楼
得票数 0

对于那些在数据存储变体上有同样问题的人,你可以这样做来摆脱这个错误:

filters = [('property', '=', 'val')]
query = client.query(kind='MyKind', filters=filters)

这确实是有记录的,但不在在线文档中。它可以在内省中找到 datastore > client.py , 809行

acortad 提问于2023-05-22
我用这个答案进行了测试,仍然得到了同样的UserWarningBanty 2023-05-31