Sous-collections de requêtes Firestore

Je pensais avoir lu que vous pouviez interroger des sous-collections avec le nouveau Firebase Firestore, mais je ne vois aucun exemple. Par exemple, j’ai ma configuration Firestore de la manière suivante:

  • Danses [collection]
    • danceName
    • Chansons [collection]
      • titre de chanson

Comment pourrais-je interroger “Trouver toutes les danses où songName == ‘X'”

    C’est une fonctionnalité qui n’existe pas encore. Cela s’appelle une “requête de groupe de collection” et vous permet d’interroger toutes les chansons, quelle que soit la danse qui les contient. C’est quelque chose que nous avons l’intention de soutenir, mais nous n’avons pas de calendrier concret pour le faire.

    La structure alternative à ce stade consiste à faire des chansons une collection de haut niveau et à faire de cette danse une partie de la propriété de la chanson.

    Que se passe-t-il si vous stockez des chansons en tant qu’object plutôt qu’en tant que collection? Chaque danse comme, avec des chansons comme un champ: tapez Object (pas une collection)

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

    alors vous pourriez demander pour toutes les danses avec un NameOfASong:

     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); }); 

    @ Nelson.b.austin Comme Firestore n’a pas encore cela, je vous suggère d’avoir une structure plate, ce qui signifie:

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

    Avoir de cette façon, vous pouvez le faire:

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

    J’espère que ça aide.

    Il serait préférable d’utiliser une structure de données plate.
    Les documents spécifient les avantages et les inconvénients de différentes structures de données sur cette page .

    Spécifiquement sur les limites des structures avec des sous-collections:

    Vous ne pouvez pas facilement supprimer des sous-collections ou effectuer des requêtes composées sur plusieurs sous-collections.

    Contrasté avec les avantages supposés d’une structure de données plate:

    Les collections de niveau racine offrent le plus de flexibilité et d’évolutivité, ainsi que des requêtes puissantes au sein de chaque collection.

    Comme l’a déclaré Gil Gilbert, il semble que des requêtes de groupes de collection soient actuellement en cours. Dans l’intervalle, il est probablement préférable d’utiliser des collections de niveau racine et de créer un lien entre ces collections à l’aide des UID du document.

    Pour ceux qui ne le savent pas déjà, Jeff Delaney a des guides et des ressources incroyables pour quiconque travaille avec Firebase (et Angular) sur AngularFirebase .

    Firestore NoSQL Relational Data Modeling – Ici, il décompose les bases de la structuration NoSQL et Firestore DB

    Modélisation avancée des données avec Firestore par exemple – Ce sont des techniques plus avancées à garder à l’esprit. Une lecture géniale pour ceux qui veulent apporter des compétences Firestore au prochain niveau

    Vous pouvez toujours chercher comme ceci: –

     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.toSsortingng()) { return actions.map(a => { const data = a.payload.doc.data() as Dance; const id = a.payload.doc.id; return { id, ...data }; }); } else { return false; } }) ); 
     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); });