flutter Firebase 按仅包含一部分的键排序

问题描述 投票:0回答:1

我想检索包含特定键的所有条目。 Firebase 条目由两个连接在一起的键组成。在此示例中,我想检索包含键

abc123
的所有条目。

Database:
    - xyz123abc123
    - abc123uvw123

代码:

String searchForKey = abc123

FirebaseDatabase.instance.ref()
    .child("note")
    .orderByKey()
    .equalTo(searchForKey*).once()         //something like that
    .then((DatabaseEvent databaseEvent){
    Map<dynamic, dynamic> values = databaseEvent.snapshot.value as Map<dynamic, dynamic>;
        values.forEach((key,values) {
        //...
});
flutter firebase dart firebase-realtime-database
1个回答
0
投票

我认为您正在寻找的是一种

endsWith()
方法。但是,Firebase 不支持此类操作。除此之外,Firebase 中没有通配符。所以你不能使用这样的东西:

FirebaseDatabase.instance.ref()
    .child("note")
    .orderByKey()
    .equalTo(searchForKey*).once() 
    //                  👆

实时数据库查询只能进行前缀匹配,即查找以某个子字符串开头的字符串。目前没有后缀匹配的操作。

在像您这样的情况下,常见的解决方法是在单个节点下添加两个属性。第一个将包含代码,第二个将包含反转的代码:

db
|
--- notes
     |
     --- nodeId
          |
          --- code: xyz123abc123
          |
          --- reverse: 321cba321zyx

然后查询两次,一次使用

abc123
,第二次使用反向
321cba
,并在客户端连接结果:

FirebaseDatabase.instance.ref()
    .child("notes")
    .orderByChild("code")
    .startAt("abc123").endAt("abc123\uf8ff")

第二个查询:

FirebaseDatabase.instance.ref()
    .child("notes")
    .orderByChild("reverse")
    .startAt("321cba").endAt("321cba\uf8ff")

为了能够获得所需的结果,请注意查询是按值排序的,而不是按键排序的。

© www.soinside.com 2019 - 2024. All rights reserved.