web-dev-qa-db-ja.com

Firestore:ドキュメントの配列内のアイテムによるクエリ

「photos」というキーを持つドキュメント「user」があります。以下は、保存される文字列の配列、つまり「写真」ドキュメントのIDです。

この「写真」フィールドで「ユーザー」を照会したい:「写真」プロパティにこのIDを持つすべてのユーザーが必要です。

これはファイヤーストアを通じて可能ですか?

37
Jaap Weijland

.where()で使用する 'array-contains'クエリ演算子を追加して、配列フィールドに特定の要素が含まれるドキュメントを検索します。

https://firebase.google.com/support/release-notes/js 5.3.0

更新@google-cloud/firestoreでも利用可能: https://github.com/googleapis/nodejs-firestore/releases/tag /v0.16.

更新2https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html

更新3がAdmin Node.js SDK v6.0.0で利用可能になりました https://github.com/firebase/firebase-admin-node/releases

27
Henry

Array Containsクエリを使用可能にしていないため、 Henryの答え を参照してください。

残念ながらまだロードマップには載っていませんが。

それまでは、代わりに次の形式のマップを使用する必要があります。

photos: {
    id1: true
    id2: true
}

これで、photos.id1 == trueでフィルタリングすることにより、id1を持つすべてのユーザーを見つけることができます。

Firebase documentation でそのようなセットのクエリについて詳しく読んでください。

32
Dan McGrath

Firestoreは、キーごとにインデックスを作成する必要があることで混乱しているように見えるため、答えを少し拡大します。

documentReference.where('param','==','value').onSnapshot(...)

ただし、これらのパラメーターのデータにインデックスを付けない限り、複合クエリを実行することはできません。したがって、次のようなことができるようにインデックスが必要になります。

 documentReference.where('param','==','value').where(..otherparams...).onSnapshot(...)

したがって、IDの写真が必要な場合は、名前を付けて保存できます

usersCollection :                        (a collection)
    uidA:                                (a document)
         photoField:                     (a field value that is a map or object)
            fieldID1 : true              (a property of the photoField)
            fieldID2 : true              (a property of the photoField)
            etc ...  

また、photoFieldにfieldID1を持っているユーザーにクエリを実行するだけで、インデックスを作成したり、以下のようなクエリを実行したりする必要はありません。

firestore.doc('usersCollection/uidA').where('photoField.fieldID1','==',true).onSnapshot(...)
5
TheeBen