Realtime DatabaseってNoSQLなのでSQLが使用できないんですよね。
なので検索するときどうやるんだっけなといつも迷ってしまうのでまとめときます。
データは以下の通りになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
{ "users" : { "aaa" : { "age" : 21, "name" : "sato" }, "bbb" : { "age" : 18, "name" : "suzuki" }, "ccc" : { "age" : 20, "name" : "tanaka" }, "ddd" : { "age" : 17, "name" : "takahashi" }, "eee" : { "age" : 25, "name" : "ito" } } } |
Firebaseのコードはこんな感じでRealtime Databaseを使用しています。
1 2 3 4 5 6 7 8 9 10 11 |
<script src="https://www.gstatic.com/firebasejs/4.1.1/firebase.js"></script> <script> var config = { apiKey: "apiKey", authDomain: "apiName.firebaseapp.com", databaseURL: "https://apiName.firebaseio.com/" }; firebase.initializeApp(config); var database = firebase.database(); </script> |
WHERE ID = ‘aaa’
シンプルにuserのkeyで取得する場合です。
1 2 3 4 |
firebase.database().ref('users/aaa') .once('value',function(snapshot) {console.log(snapshot.val())}) > {age: 21, name: "sato"} |
WHERE name = ‘sato’
nameのvalueで検索する場合です。
orderByChildを使用すると検索対象のkeyにindexを設定しないと警告が表示されます。
‘sato’に一致した値が全て返されます。
1 2 3 4 5 |
firebase.database().ref('/users') .orderByChild('name').startAt('sato').endAt('sato') .once('value',function(snapshot) {console.log(snapshot.val())}) > {aaa: {…}} |
WHERE age BETWEEN 18 AND 21
範囲で指定して検索してみます。
1 2 3 4 5 |
firebase.database().ref('/users') .orderByChild('age').startAt(18).endAt(21) .once('value',function(snapshot) {console.log(snapshot.val())}) > {aaa: {…}, bbb: {…}, ccc: {…}} |
LIMIT 2
取得数を制限します。
この例では年齢順に2件まで取得しています。
昇順降順と書いていますがハッシュで返されるので順番ではないです。
limitToFirst
は該当条件の先頭から取得します。(昇順)
bbbは18才、dddは17才
1 2 3 4 5 |
.database().ref('/users').orderByChild('age') .startAt(1).limitToFirst(2) .once('value',function(snapshot) {console.log(snapshot.val())}) > {bbb: {…}, ddd: {…}} |
limitToLast
は該当条件の後方から取得します。(降順)
aaaは21才、eeeは25才
1 2 3 4 5 |
firebase.database().ref('/users').orderByChild('age') .startAt(1).limitToLast(2) .once('value',function(snapshot) {console.log(snapshot.val())}) > {aaa: {…}, eee: {…}} |
WHERE name like ‘ta%’
前方一致は可能でした。(2017/9/13追記)
すげー。
Firebase公式の動画にあった。。
1 2 3 4 5 |
firebase.database().ref('/users') .orderByChild('name').startAt('ta').endAt('ta\uf8ff') .once('value',function(snapshot) {console.log(snapshot.val())}) > {ccc: {…}, ddd: {…}} |
あとがき
パターン検索とかあったけどめんどいからやってない。
ElasticSearchをゴニョゴニョするとできる。
暇があったら追記する!(あった 2017/9/13追記)
参考
The Firebase Blog: Queries, Part 1: Common SQL Queries Converted for Firebase
ウェブ上でデータリストを操作 | Firebase
javascript – How to perform sql ‘LIKE’ operation on firebase? – Stack Overflow
スポンサードリンク