0
votes

How to query collection of firebase so that it also includes its subcollection? So I have collection posts with documents and every document has field subcollection likes. After getting collection posts I have objects and inside them values of fields, but inside each object (post) I want to have besides those values an object aka subcollection likes.

2

2 Answers

0
votes

Queries in Firestore are by definition shallow. There is no way to get results from both a parent collection and its subcollections in a single query.

When I want all data from a parent document and a subcollection in the same operation, and it's not too much, I typically (also) include it in the parent document.

0
votes

Ive done in it this function but i dont feel like making it look pretty theres tons of code that isnt needed here anyways here is solution maybe it helps someone:

getPosts = async () => {
    this.setState({ isLoading: true });
    const snapshot = await firebase
      .firestore()
      .collectionGroup("posts")
      .orderBy("id", "desc")
      .limit(7)
      .get();

      let array = [];
      const snap = await firebase
      .firestore()
      .collection("posts")
      .get();
      for (let i = 0; i < snap.docs.length; i++) {
        array.push(snap.docs[i].data().id);
        //console.log(array);
        //newpost[i].userHandle = [result]; //your new object here
      }


      

    if (!snapshot.empty) {
      let newpost = [];

      this.setState({ lastDoc: snapshot.docs[snapshot.docs.length - 1] });

      // snapshot.forEach((doc) => {
      //   const PostItem = doc.data();
      //   PostItem.id = doc.id;
      //   newpost.push(PostItem);
      // });
      


let newpost2 = [];
let result = [];
let finish = [];
let groupByKey = [];
let bruh = [];
let uf = [];
    const listOfPosts = await firebase.firestore().collection("posts").get()
    .then((val) => val.docs);

      for (var i=0; i<listOfPosts.length; i++)
      {
        const snapshot = await firebase.firestore().collection("posts").doc(
        listOfPosts[i].id.toString())
        .collection("hugs").get();
        snapshot.forEach(doc => {
          
          newpost2.push(doc.data());
          result = newpost2.map(a => a.userHandle)
          //console.log(newpost2)
          newpost2.map(obj=> ({ ...obj, result}))
          //console.log(newpost2)
          groupByKey.push((list, key, {omitKey=false}) => list.reduce((hash, {[key]:value, ...rest}) => ({...hash, [value]:( hash[value] || [] ).concat(omitKey ? {...rest} : {[key]:value, ...rest})} ), {}))
          groupByKey.push((newpost2, 'id', {omitKey:false}))

                      uf = [];
                  newpost2.forEach((obj)=> {
              if(typeof uf[obj.id] === 'undefined') {
                uf[obj.id] = {id: obj.id, userHandle: [obj.userHandle]}
              }
              else {
                uf[obj.id].userHandle.push(obj.userHandle);
              }
            });

            uf = uf.filter(item => !(item == "undefined"));

                      //console.log(groupByKey)
          //this.setState({ post: [...newpost,] });
        });
        //finish = a1.map(t1 => ({...t1, ...a2.find(t2 => t2.id === t1.id)}))
        //console.log(newpost2)
    }
    for (let i = 0; i < snapshot.docs.length; i++) {
      newpost.push(snapshot.docs[i].data());
      //newpost[i].username = result;
      //newpost[i].userHandle = [result]; //your new object here
    }
    //var element = {}, cart = [];
    //newpost.id = id;
    //element.quantity = quantity;
    //newpost2.push(newpost);

// Array of Objects in form {element: {id: 10, quantity: 10} }
    
    finish = newpost.map(t1 => ({...t1, ...uf.find(t2 => t2.id === t1.id)}))
    //if(Object.keys(groupByKey) === t1.id){console.log("nigba")}
    //var result2 = newpost.map(function(e) {
      //var find = groupByKey.find(a => a.email == e.email);
      //return console.log(Object.assign({}, e, find))
    //})
    
    console.log(finish)
    this.setState({ post: [...newpost,] });
    //console.log(this.state.post)
    } else {
      this.setState({ lastDoc: null });
    }

    this.setState({ isLoading: false });
    //setTimeout(
      //console.log(this.state.post)
      //, 50000); 
  };