firebase Firestore:查询where子句>嵌套字段

3hvapo4f  于 2022-12-05  发布在  其他
关注(0)|答案(2)|浏览(103)

我使用Flutter和Firestore。假设我的数据库如下所示:

[
  {
    Name: 'John',
    Address: {
      Street: "John doe street"
      Postal: "12047"
    }
  },
  {
    Name: 'Mary',
    Address: {
      Street: "Fleet street"
      Postal: "1242B"
    }
  }
]

现在我想搜索所有邮政编码包含“12”的人。因此,这将意味着在这个虚拟数据库中的两个记录。
但是如何筛选嵌套字段“Address.Postal”呢?

var ref = FirebaseFirestore.instance;
var query = '12';
ref.collection('users')
        .where(
          'Address.Postal', // Won't work
          ... // There is no 'like' operator or something that looks alike
        );

仅供参考,Flutter中的项目无关紧要。

lymnna71

lymnna711#

没有办法检查数组项中的特定属性。你所能做的就是检查整个项是否存在于array-contains中。但要做到这一点,你需要知道整个数组项,也就是所有的名称和地址属性。
如果你只有名字,没有内置的操作符来测试数组项是否包含这个名字,你只需要把名字提取到自己的数组中(比如addressNames),然后对它使用array-contains

icomxhvb

icomxhvb2#

where()函数现在接受FieldPath示例作为第一个参数。这允许您在查询中引用嵌套字段或documentId()
示例:

queryText = '12';

postalRef = new FieldPath('Address', 'Postal');
ref.collection('users')
        // Equivalent of LIKE "queryText%"
        .where(postalRef, '>=', queryText)
        .where(postalRef, '<=', queryText+ '\uf8ff');

至于SQL LIKE语句的Firestore等效语句this answer explains it better,简单地说,可以使用>=<=运算符按字符值查询string字段。
\uf8ff(Private-Use Area)只是此操作常用的分隔符,因为:

  • 这是一个很高的Unicode字符
  • 这超出了您对基于Web的“文本搜索”的预期。

相关问题