我正在使用 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 中的项目无关紧要。
最佳答案
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)使用区域 )只是此操作的常用分隔符,因为:
- 这是一个非常高级的 unicode 字符
- 这超出了您对基于网络的“文本搜索”的期望。
关于firebase - 火存储 : query where clause > nested field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70961448/