studio query firestore data consultas consulta collection firebase google-cloud-firestore

firebase - data - firestore query



Subcolecciones de consultas de Firestore (8)

Limitaciones de consultas

Cloud Firestore no admite los siguientes tipos de consultas:

  1. Consultas con filtros de rango en diferentes campos.

  2. Consultas individuales en múltiples colecciones o subcolecciones. Cada consulta se ejecuta contra una única colección de documentos. Para obtener más información acerca de cómo su estructura de datos afecta sus consultas, consulte Elegir una estructura de datos .

  3. Consultas lógicas o. En este caso, debe crear una consulta separada para cada condición OR y combinar los resultados de la consulta en su aplicación.
  4. Consultas con una cláusula! =. En este caso, debe dividir la consulta en una consulta mayor que una consulta menor que. Por ejemplo, aunque la cláusula de consulta donde ("age", "! =", "30") no es compatible, puede obtener el mismo conjunto de resultados combinando dos consultas, una con la cláusula where ("age", "< "," 30 ") y uno con la cláusula where (" age ","> ", 30).

Pensé que leí que puedes consultar subcolecciones con el nuevo Firebase Firestore, pero no veo ningún ejemplo. Por ejemplo, tengo mi configuración de Firestore de la siguiente manera:

  • Danzas [colección]
    • danceName
    • Canciones [colección]
      • nombre de la cancion

¿Cómo podría consultar "Buscar todos los bailes donde songName == ''X''"


¿Qué pasa si almacena canciones como un objeto en lugar de como una colección? Cada baile como, con canciones como un campo: escriba Object (no una colección)

{ danceName: "My Dance", songs: { "aNameOfASong": true, "aNameOfAnotherSong": true, } }

entonces puedes consultar todos los bailes con aNameOfASong:

db.collection(''Dances'') .where(''songs.aNameOfASong'', ''=='', true) .get() .then(function(querySnapshot) { querySnapshot.forEach(function(doc) { console.log(doc.id, " => ", doc.data()); }); }) .catch(function(error) { console.log("Error getting documents: ", error); });


Sería mejor usar una estructura de datos plana.
Los documentos especifican los pros y los contras de las diferentes estructuras de datos en esta página .

Específicamente sobre las limitaciones de las estructuras con subcolecciones:

No puede eliminar fácilmente subcolecciones o realizar consultas compuestas en subcolecciones.

En contraste con las supuestas ventajas de una estructura de datos plana:

Las colecciones de nivel raíz ofrecen la mayor flexibilidad y escalabilidad, junto con consultas potentes dentro de cada colección.


Siempre puedes buscar así: -

this.key$ = new BehaviorSubject(null); return this.key$.switchMap(key => this.angFirestore .collection("dances").doc("danceName").collections("songs", ref => ref .where("songName", "==", X) ) .snapshotChanges() .map(actions => { if (actions.toString()) { return actions.map(a => { const data = a.payload.doc.data() as Dance; const id = a.payload.doc.id; return { id, ...data }; }); } else { return false; } }) );


ACTUALIZACIÓN 2019

Firestore ha lanzado consultas de grupo de colección. Vea la respuesta de Gil arriba o la documentación oficial de la Consulta de grupo de colección

Respuesta anterior

Como dijo Gil Gilbert, parece que las consultas del grupo de recopilación están actualmente en proceso. Mientras tanto, probablemente sea mejor usar colecciones de nivel raíz y simplemente vincular entre estas colecciones usando los UID del documento.

Para aquellos que aún no lo saben, Jeff Delaney tiene algunas guías y recursos increíbles para cualquiera que trabaje con Firebase (y Angular) en AngularFirebase .

Modelado de datos relacionales NoSQL de Firestore : aquí desglosa los conceptos básicos de la estructuración de DB NoSQL y Firestore

Modelado de datos avanzado con Firestore por ejemplo : estas son técnicas más avanzadas para tener en cuenta. Una gran lectura para aquellos que quieran llevar sus habilidades de Firestore al siguiente nivel


ACTUALIZAR Ahora Firestore admite matriz-contiene

Tener estos documentos

{danceName: ''Danca name 1'', songName: [''Title1'',''Title2'']} {danceName: ''Danca name 2'', songName: [''Title3'']}

hacerlo de esta forma

collection("Dances") .where("songName", "array-contains", "Title1") .get()...

@ Nelson.b.austin Como firestore todavía no tiene eso, le sugiero que tenga una estructura plana, lo que significa:

Dances = { danceName: ''Dance name 1'', songName_Title1: true, songName_Title2: true, songName_Title3: false }

Teniéndolo de esa manera, puedes hacerlo:

var songTitle = ''Title1''; var dances = db.collection("Dances"); var query = dances.where("songName_"+songTitle, "==", true);

Espero que esto ayude.


Actualización 2019-05-07

Hoy lanzamos consultas de grupo de recopilación , y estas le permiten consultar entre subcolecciones.

Entonces, por ejemplo en el SDK web:

db.collectionGroup(''Songs'') .where(''songName'', ''=='', ''X'') .get()

Esto coincidiría con los documentos de cualquier colección donde la última parte de la ruta de la colección sea ''Canciones''.

Su pregunta original era sobre encontrar bailes donde songName == ''X'', y esto todavía no es posible directamente, sin embargo, para cada canción que coincida, puede cargar su padre.

Respuesta original

Esta es una característica que aún no existe. Se llama "consulta de grupo de colección" y le permitiría consultar todas las canciones independientemente de qué baile las contuviera. Esto es algo que pretendemos apoyar, pero no tenemos una línea de tiempo concreta sobre cuándo llegará.

La estructura alternativa en este punto es hacer que las canciones sean una colección de alto nivel y hacer que el baile de la canción sea parte de una propiedad de la canción.


var songs = [] db.collection(''Dances'') .where(''songs.aNameOfASong'', ''=='', true) .get() .then(function(querySnapshot) { var songLength = querySnapshot.size var i=0; querySnapshot.forEach(function(doc) { songs.push(doc.data()) i ++; if(songLength===i){ console.log(songs } console.log(doc.id, " => ", doc.data()); }); }) .catch(function(error) { console.log("Error getting documents: ", error); });