51090
firebaseを使ったアプリを作っているのですが、データの取り出し方で分からない事があります。

[![画像の説明をここに入力](https://i.stack.imgur.com/7daqq.png)](https://i.stack.imgur.com/7daqq.png)

firebaseにデータがこのように`{url_1:["https://~",
0]}`という感じに入っていてリストの`0`の部分を`1`に変更する事でフラグにして使おうと考えています。

そこで`ref.get()`だと毎回全てのデータを取得して使うことになるので`0`になってる奴だけ取得するにはどのように書いたら良いのでしょうか？

firebaseはpythonで使用しています。  
よろしくお願いします。

**コード実行後**

```

    Reason: Index not defined, add ".indexOn": "flag", for path "/my_select/bookmarks", to the rules
    
```

どのように変更していったら良いのでしょうか？

**変更後**  
このように変更したらエラーはなくなりましたが中身が空です。

```

    ref = db.reference('/my_select')
    snapshot = ref.order_by_child('flag').equal_to(0).get()
    print(snapshot)
    
```

なんとかここのページを参考にしたらできました。  
[Firebaseでindexを貼るとどのくらいソートが速くなるのか -
Qiita](https://qiita.com/qantasmz/items/d30d04c8ae41563ba2c1)
CC BY-SA 4.0
2018-12-09T06:19:45.693
51059
2020-08-19T02:07:49.923
2020-08-19T02:07:49.923
3060
22565
question
python python3 firebase
Firebaseで取得するデータを絞るには？ python用
Realtime Database の場合は、配列（Array）の使用は推奨されないので、次のように配列を使わない形に変更します。

```

    url_1:{
        name: "https://~",
        flag: 0
    }
    
```

そうすると、以下のように`order_by_child`を使ってフィルターをかけるて0だけを取得することができます。

```

    ref = db.reference('/my_select/bookmarks')
    snapshot = ref.order_by_child('flag').equal_to(0).get()
    
```

なお、条件を指定するには指定する子キー（上の例では'flag'）に対してインデックスの作成が必要になります。以下を参考にルールに.indexOnを追加してください。  
<https://firebase.google.com/docs/database/security/indexing-data?hl=ja>

具体的には、コンソールのルールタブで、`rules`に`".indexOn": ["flag"]`を追加すればいいです。（以下は例です）

```

    {
      "rules": {
        ".read": false,
        ".write": false,
        "my_select":{
          "bookmarks":{
            ".indexOn": ["flag"]   
          }
        }
      }
    }
    
```

Firestore
の場合は、配列メンバーのクエリはサポートしていないそうです。0になってるのだけ取得したいのであれば、フィールドのタイプを「配列」ではなくて「マップ」にすれば可能です。  
・参照: Firestore ドキュメント
[「配列、リスト、セットの操作」のページ](https://firebase.google.com/docs/firestore/solutions/arrays)

具体的には、現状のデータは、以下のようになっていますが、

```

    url_1: ["https://~", 0]
    
```

それを以下のようなものに変更します。

```

    url_1:{
        name: "https://~",
        flag: 0
    }
    
```

そうすれば、次のように where()メソッドを使って、0になってるものだけを取得できます。

```

    db = firestore.client()
    docs = db.collection('my_select').where('bookmarks.flag', '==', 0).get()
    
```
CC BY-SA 4.0
2018-12-10T12:11:15.020
51090
2018-12-14T08:58:34.097
2018-12-14T08:58:34.097
15171
15171
51059
answer