1

With this code

 import * as functions from "firebase-functions";
import admin from "firebase-admin";
import { addFeed } from "../../../utils/feeds";

export default functions.firestore
  .document("meinprofilsettings/{userUid}/following/{followingUid}")
  .onCreate(async (snap, context) => {
    const db = admin.firestore();
    const { userUid, followingUid } = context.params;
    const userSnap = await db.doc(`meinprofilsettings/${userUid}`).get();
    const { username = "Userdoesnotexists" } = userSnap.exists
      ? userSnap.data()
      : 7;


      //code for the each
      const uservideos= await db.collection("videos").where(“uid”, “==“, followingUid).get().then(function(video){
        await db
        .doc(`meinprofilsettings/${followingUid}/followingvideos/${userUid}`)
        .set({ uid: userUid ,videourl:video.data.videourl}, { merge: true });
      }),



    const incrementFollowing = admin.firestore.FieldValue.increment(1);

    return db
      .doc(`meinprofilsettingscounters/${userUid}`)
      .set({ following: incrementFollowing }, { merge: true });
  });

Im trying to get from a collection every videos that are from a specific user. Then I wanna set in another collection each id of the video with the video url ,but im struggling with the code .

So with this part

  const uservideos= await db.collection("videos").where(“uid”, “==“, followingUid).get()

Im getting each video. im sure that this is corect , but how can now set every video in another collection

like this

.then(function(video){
        await db
        .doc(`meinprofilsettings/${followingUid}/followingvideos/${userUid}`)
        .set({ uid: userUid ,videourl:video.data.videourl}, { merge: true });
      }),

In this part im struggling and not sure what to do exactly and if its correct. So please hope anyone can tell me if we can use a ".then". If so , how can I ran then a foreach and how can I get the data like video url or name . If it's not possible, please tell me then how to do it also.

1 Answer 1

3

Since you want to execute an undetermined number of calls to the asynchronous set() method in parallel, you can use Promise.all() as follows:

export default functions.firestore
  .document("meinprofilsettings/{userUid}/following/{followingUid}")
  .onCreate(async (snap, context) => {
      
    const db = admin.firestore();
    const { userUid, followingUid } = context.params;
    const userSnap = await db.doc(`meinprofilsettings/${userUid}`).get();
    
    const { username = "Userdoesnotexists" } = userSnap.exists
      ? userSnap.data()
      : 7;

    const videosQuerySnapshot = await db.collection("videos").where(“uid”, “==“, followingUid).get();
    
    const promises = [];
    
    videosQuerySnapshot.forEach(videoDocSnapshot => {
        
        promises.push(db
            .doc(`meinprofilsettings/${followingUid}/followingvideos/${userUid}`)
            .set({ uid: userUid, videourl: videoDocSnapshot.get('videourl') }, { merge: true })
        )
        
    })
    
    await Promise.all(promises);

    const incrementFollowing = admin.firestore.FieldValue.increment(1);

    return db
      .doc(`meinprofilsettingscounters/${userUid}`)
      .set({ following: incrementFollowing }, { merge: true });
  });
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.