Firestore: запрос по элементу в массиве документа

У меня есть документ "пользователь", который имеет ключ под названием "фотографии". Вот массив сохраняемых строк, а именно идентификаторы "фото" документов.

Я хочу запросить "пользователь" в этом поле "фотографии": я хочу, чтобы все пользователи, у которых есть этот идентификатор, находятся в свойстве "фотографии".

Возможно ли это через firestore?

Ответ 1

Добавлен оператор запроса "array-contains" для использования с.where(), чтобы найти документы, в которых поле массива содержит определенный элемент.

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

Обновление: также доступно в @google-cloud/firestore: https://github.com/googleapis/nodejs-firestore/releases/tag/v0.16.0

Обновить 2 https://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

Ответ 2

К сожалению, пока нет, хотя это и по нашей дорожной карте.

В то же время вам нужно будет использовать карту вместо:

photos: {
    id1: true
    id2: true
}

Теперь вы можете найти всех пользователей с id1 путем фильтрации по photos.id1 == true.

Подробнее о запросе таких наборов в документации Firebase.

Ответ 3

Ниже приведена небольшая часть ответа на вопрос, поскольку некоторые, похоже, путают необходимость делать индексы для каждого ключа, Firestore уже индексирует ваши данные для простых запросов, поэтому вы можете сделать простой запрос, например

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

но вы не можете выполнять сложный запрос, если вы не индексируете свои данные для этих параметров. Поэтому вам нужно, чтобы индексы могли делать что-то вроде этого:

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

До тех пор, пока вам нужны фотографии для идентификатора, вы можете сохранить их как

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

и вы можете просто запросить пользователей, у которых есть, допустим, fieldID1 в их photoField, без необходимости создавать какой-либо индекс и похожий запрос ниже.

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