【问题标题】:Firestore in query problemsFirestore 中的查询问题
【发布时间】:2022-01-24 10:51:05
【问题描述】:

我在 Firestore 中有一个类似于 ['west_coast', 'east_coast'] 的数组字段,如果在动态数据的同一数组中找到 west_coast 和 east_coast,我想获得结果

当我按照 Firestore 网站上的示例执行此操作时,它可以工作。

const exactlyOneCoast = await citiesRef.where('region', 'in',[['west_coast', 'east_coast']]).get();

但是由于数据是动态来的,如果数据在数组中的位置不同,则不会给出任何结果。

const exactlyOneCoast = await citiesRef.where('region', 'in',[['east_coast', 'west_coast']]).get();

我希望即使他们换地方也能找到它。有没有办法做到这一点?

【问题讨论】:

  • 您能分享一下您的文档截图吗?两个数组肯定是不同的,所以一个查询不会匹配另一个。

标签: javascript firebase google-cloud-platform google-cloud-firestore


【解决方案1】:

如果您有一个名为“region”的数组字段包含两个值“east_coast”和“west_coast”,那么您无法使用以下查询:

const exactlyOneCoast = await citiesRef.where('region', 'in',[['west_coast', 'east_coast']]).get();

也不:

const exactlyOneCoast = await citiesRef.where('region', 'in',[['east_coast', 'west_coast']]).get();

为什么?因为in 运算符 作用于String 类型的字段,而 作用于数组类型的字段。因此,如果您有一个字符串类型的字段,in 查询会返回给定字段与任何比较值匹配的文档。

如果您需要检查数组中是否存在特定值,则应使用array_contains 运算符。既然你cannot chain multiple such calls,那么你应该执行多个单独的数据库调用。

【讨论】:

  • const exactOneCoast = await urbanRef.where('region', 'in',[['west_coast', 'east_coast'], ['east_coast', 'west_coast']]).get() ;如果我试试这个会有用吗?
  • 不会,不会。您应该只使用array_contains 运算符。
  • 您应该只使用 array_contains 操作符。你说但我没有机会这样做它不是在单个查询中连续使用
  • 很抱歉,我没听懂您的最后评论。能不能说的具体点?
  • 嗨,亚历克斯。我觉得这没什么用,你为什么要这么努力?你告诉我不会这样,我也知道。你没有给我解决方案
【解决方案2】:

您正在执行的查询正在寻找完全匹配的数组 [docs]

您可以使用数组值作为 in 的比较值,但与 array-contains-any 不同的是,该子句匹配数组长度、顺序和值的精确匹配。

如果您删除一组括号,如果区域是west_coasteast_coast,它将返回

citiesRef.where('region', 'in',['east_coast', 'west_coast'])

inarray_containsarray_contains_any 运算符是逻辑 OR 搜索,因此如果您想返回一个数组(在您的文档中)包含两个元素的文档,那么您需要执行 @ 987654322@。但是,您不能执行多个 array_contains 查询。相反,您需要分别执行多个查询,然后围绕它们构建自己的逻辑。


编辑:修复了我忘记的链式 array_contains 问题。

【讨论】:

猜你喜欢
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2019-03-05
  • 1970-01-01
  • 2022-01-23
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多