web-dev-qa-db-ja.com

Firebaseでのワイルドカードクエリ?

Firebaseでワイルドカードクエリを実行することは可能ですか?例えば:

https://foo.firebaseio.com/person.json?orderBy="name"&equalTo="Lun*"
10
MoreScratch

久しぶりですが、他の人も興味があるのではないかと思いました。 foo*のようなものをワイルドカード検索で「偽造」することができます(したがって、基本的には、指定された文字列で始まる値を検索できます)。

IOSの場合&Swift次のようになります:

dbReference.child("person").queryOrdered(byChild: "name").queryStarting(atValue: "foo").queryEnding(atValue: "foo\u{f8ff}").observe(.childAdded) { (snapshot: FIRDataSnapshot) in
    print("\(snapshot.key) - \(String(describing: snapshot.value))")
}

これは、nameプロパティの開始値と終了値を使用します。ここで、終了キーは、開始+ Unicode範囲の非常に高いコードポイントに等しくなります。 Unicodeのほとんどの通常の文字の後にあるため、クエリはfooで始まるすべての値に一致します。

9
Mihai Fratu

いいえ。でもちょっと。

ワイルドカードクエリを実行することはできませんが、これを可能にするデータを構造化することはできます。

たとえば、名前がLerで始まるユーザーに一致するものを検索するとします。

これが私たちの構造です

users
  uid_0
    name: "Leroy"

分解されたデータを別のノードに保存します。ディスク容量は安価であることを忘れないでください。

decomposed
  uid_0
    L: true
    Le: true
    Ler: true
    Lero: true
    Leroy: true

次に、分解されたノードで、Lerに等しい子のtrueの値についてクエリを実行します。

ref.queryOrderedByChild("Ler").queryEqualToValue(true).observeEventType(.ChildAdded, 
     withBlock: { snapshot in
                    print(snapshot.key)
                })

そして、snapshot.keyはuid_0になります

3
Jay

あなたはこのようなことをすることができます。

検索フィールドは必ずアルファベット順に並べてください。

次に、最後の文字「o」が最初の最後の文字「n」+ 1で計算されるすべての名前(Lunで始まりLuoで終わる)を検索します。

ここに一般的な考え方があります。

したがって、「Lun *」の間にあるものを返し、「Luo *」の最初のエントリで停止する必要があります。

https://foo.firebaseio.com/person.json?orderBy="name"&startAt="Lun"&endAt="Luo"
0
Stephane