Firestore: consulta por item na matriz do documento

Eu tenho um documento “usuário”, que tem uma chave chamada “fotos”. Aqui está uma matriz de strings sendo salvos, ou seja, os IDs dos documentos “photo”.

Quero consultar “usuário” por esse campo “fotos”: desejo que todos os usuários que tenham esse ID estejam na propriedade “fotos”.

Isso é possível através do firestore?

Adicionado operador de consulta ‘array-contém’ para uso com .where () para localizar documentos onde um campo de matriz contém um elemento específico.

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

Atualização : também disponível em @google-cloud/firestore : https://github.com/googleapis/nodejs-firestore/releases/tag/v0.16.0

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

Atualização 3 agora disponível no SDK v6.0.0 do Admin Node.js https://github.com/firebase/firebase-admin-node/releases

Infelizmente ainda não, embora esteja no nosso roteiro.

Enquanto isso, você precisará usar um mapa, na forma de:

 photos: { id1: true id2: true } 

Agora você pode encontrar todos os usuários com photos.id1 == true filtrando por photos.id1 == true .

Leia mais sobre como consultar esses conjuntos na documentação do Firebase .

Aqui está um pouco de expansão na resposta, pois alguns parecem estar confusos sobre ter que fazer índices para cada chave, o Firestore já indexa seus dados para consultas simples, assim você pode fazer uma consulta simples como

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

mas você não pode fazer uma consulta composta, a menos que você indexe seus dados para esses parâmetros. Então você precisaria de índices para poder fazer algo assim:

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

Então, enquanto você precisa das fotos para um ID, você pode salvá-las como

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

e você pode simplesmente consultar usuário (s) que tem, digamos, fieldID1 em seu photoField sem precisar formar qualquer índice e consulta similar abaixo.

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