【问题标题】:Firestore query comparing two arrays without array-containsFirestore 查询比较两个没有数组包含的数组
【发布时间】:2020-06-22 17:48:17
【问题描述】:

是否可以在没有“数组包含”的情况下比较 Firestore 查询中的两个数组?

类似这样的:

    query = query.where(
       "info.currentLocation",
       "==",
       currentUserBasicInfo.currentLocation
    );

info.currentLocationcurrentUserBasicInfo.currentLocation 都是具有映射值的数组。我无法更改数据结构,并且查询中已经有一个“数组包含”。因为这两个数组必须相同才能运行,所以我觉得必须有一种方法可以比较两个数组,而不必使用“array-contains”或“array-contains-any”或“IN”。

有什么建议吗?这可能吗?

【问题讨论】:

  • 我刚刚在评论中看到你让它工作了。您可以发布自己的答案吗,因为我认为这对其他人非常有用?

标签: firebase react-native google-cloud-firestore


【解决方案1】:

“array-contains”方法能够查询数组[1]中的元素。这意味着您可以将元素保留为数组,并轻松查询它们,而无需求助于 map hack。

如果您不想使用此方法,另一种方法是迭代两个数组,直到匹配所需的值。

但是,在本文档[2] 中,您可以找到多个执行简单和复合查询的示例。

[1]https://firebase.google.com/docs/firestore/query-data/queries

[2]https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html

【讨论】:

    【解决方案2】:

    问题

    你需要的是类似于array-contains-all的东西。

    所以假设在 firebase 你有这个:

    然后在你的代码中你有这样的东西:

    const usersIDs = [
      'q4nemfzg19OCmwm1EauiZwdYD4z1',
      'UzmgPRtlRSZX44erF6VrkYQ5Kyf1',
    ];
    

    然后你想和这样的东西比较:

    yourCollectionRef.where('users', 'array-contains-all', usersIDs).get()
    // or 
    yourCollectionRef.where('users', '==', usersIDs).get()
    

    但这目前是不可能的array-contains-all 仍然是一个请求的功能,== 不起作用。

    解决方案

    所以好消息是,如果您愿意改变收藏结构,我可以为您提供解决方案。

    不要将数据保存在数组中,而是将其保存在地图对象中,项目将成为键。

    像这样:

    然后您可以根据需要轻松使用过滤器==。当然,您可以将数组转换为地图对象,或者简单地像这样:

    const usersMap = {
      q4nemfzg19OCmwm1EauiZwdYD4z1: null,
      UzmgPRtlRSZX44erF6VrkYQ5Kyf1: null,
    };
    

    这将是您的最终查询:

    yourCollectionRef.where('usersMap', '==', usersMap).get();
    

    如果您将来需要从 usersMap 中的特定用户获取所有文档,您可以在此处使用此查询:

    yourCollectionRef.where(`usersMap.${userId}`, '==', null).get();
    

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 2014-02-08
      • 2019-05-23
      • 2021-11-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      相关资源
      最近更新 更多