Firestore: Query by item in array of document

血红的双手。 提交于 2019-12-17 03:08:14

问题


I have a document "user" which has a key called "photos". Here is an array of strings being saved, namely the IDs of the "photo" documents.

I want to query "user" by this "photos" field: I want all users who have this ID in the "photos" property.

Is this possible through firestore?


回答1:


Added 'array-contains' query operator for use with .where() to find documents where an array field contains a specific element.

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

Update: also available in @google-cloud/firestore: https://github.com/googleapis/nodejs-firestore/releases/tag/v0.16.0

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

Update 3 now available in Admin Node.js SDK v6.0.0 https://github.com/firebase/firebase-admin-node/releases




回答2:


See Henry's answer, as we've no made Array Contains queries available.

Unfortunately not yet, although it's on our roadmap.

In the meantime, you'll need to use a map instead, in the form of:

photos: {
    id1: true
    id2: true
}

Now you can find all users with id1 by filtering by photos.id1 == true.

Read more about querying such sets in the Firebase documentation.




回答3:


Here is a bit of expansion on the answer as some seem to be confused about having to make indexes for each key, Firestore already indexes your data for simple queries thus you can do a simple query like

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

but you can not do a compound query unless you index your data for those parameters. So you would need indexes to be able to do something like this:

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

So as long as you need the photos for an id you can save them as

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 ...  

and you can simply query user(s) that have, let's say, fieldID1 in their photoField without needing to form any index and like query below.

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


来源:https://stackoverflow.com/questions/46849222/firestore-query-by-item-in-array-of-document

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!