๐ŸŒŸ Firebase: ์ผ๊ด„ ์“ฐ๊ธฐ

summereuna๐Ÿฅยท2022๋…„ 8์›” 3์ผ

๐ŸŒŸ Twinkle (React, Firebase)

๋ชฉ๋ก ๋ณด๊ธฐ
34/42

ํ˜„์žฌ profile.js ์—์„œ tweet.creatorId === userObj.uid ์ธ ํŠธ์œ— ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์œ ์ €๋ช…์„ userObj.displayName์„ ์—…๋ฐ์ดํŠธ ํ•˜์—ฌ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ tweetObj์— ์ €์žฅ๋œ creatorName์€ ๋ฐ”๋€Œ์ง€ ์•Š์•„์„œ ๋‚ด๊ฐ€ ์“ด ์˜ˆ์ „ ํŠธ์œ—์—๋Š” ์˜ˆ์ „ ๋‹‰๋„ค์ž„์ด ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค ใ… ใ… 
์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•ด ๋ณด์ž!

โœ… displayName ์ˆ˜์ • ์‹œ, userObj.uid === tweetObj.creatorId ์ธ tweets ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  docs์˜ creatorName`๋„ ์ผ๊ด„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ

//ver. 9
//ํŠธ์œ— ์ž‘์„ฑ์ž๋ช… ์ผ๊ด„ ๋ณ€๊ฒฝ (batch: 500๊ฐœ ๋ฌธ์„œ ์ œํ•œ)
const updateAllMyTweets = async () => {
  const batch = writeBatch(dbService);

  const myTweetsQ = query(
    collection(dbService, "tweets"),
    where("creatorId", "==", userObj.uid)
  );

  const myTweetsQuerySnapshot = await getDocs(myTweetsQ);

  myTweetsQuerySnapshot.forEach((tweet) => {
    const myTweetsDocRef = doc(dbService, "tweets", `${tweet.id}`);
    batch.update(myTweetsDocRef, {
      creatorName: newDisplayName,
    });
  });
  await batch.commit();
};
updateAllMyTweets();
  1. ์ผ๊ด„์“ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์ž.
    const batch = writeBatch(dbService);
    ์ฐธ๊ณ ๋กœ ์ผ๊ด„์“ฐ๊ธฐ๋Š” ์ตœ๋Œ€ 500๊ฐœ ์ž‘์—…์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๊ณ , ํฌํ•จ๋œ ๊ฐ ์ž‘์—…์€ Cloud Firestore ์‚ฌ์šฉ๋Ÿ‰์— ๋ณ„๋„๋กœ ํ•ฉ์‚ฐ๋œ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ๋Š” 500๊ฐœ ์ด์ƒ ๋ฌธ์„œ๋ฅผ ์“ธ ์ผ์ด ์—†์œผ๋‹ˆ ์ผ๊ด„๋ฐฐ์น˜๋กœ ๊น”๋”ํ•˜๊ฒŒ ๊ฐ€์ž๊ตฌ์š” ^3^..

  1. ์ปฌ๋ ‰์…˜์—์„œ ์—ฌ๋Ÿฌ ๋ฌธ์„œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์ฟผ๋ฆฌ์™€ ์ฟผ๋ฆฌ์Šค๋ƒ…์ƒท์„ ์ด์šฉํ•œ๋‹ค.
    query(collection(dbService, "tweets"), where("creatorId", "==", userObj.uid)
    ํ˜„์žฌ ๋‚ด tweets ์ปฌ๋ ‰์…˜์˜ ๋ฌธ์„œ๋Š” addDoc()์œผ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œ์˜ doc.id๋Š” ๋ฌด์ž‘์œ„๋กœ ํ˜•์„ฑ๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ where()์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ์œ— ์ž‘์„ฑ์ž id์™€ userObj์˜ uid๊ฐ€ ๊ฐ™์€ tweet ๋ฌธ์„œ๋งŒ ์ฟผ๋ฆฌํ•˜์—ฌ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ํŠธ์œ—๋งŒ ๊ฐ€์ ธ์˜ค์ž.

    const myTweetsQuerySnapshot = await getDocs(myTweetsQ);
    getDocs()์€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ฟผ๋ฆฌ ์Šค๋ƒ…์ƒท์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


  1. forEach()๋กœ ๊ฐ€์ ธ์˜จ documents ๊ฐ๊ฐ์˜ doc.id๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ๊ฐ์˜ ๋ฌธ์„œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค.
    myTweetsQuerySnapshot.forEach((tweet) => { const myTweetsDocRef = doc(dbService, "tweets", `${tweet.id}`); batch.update(myTweetsDocRef, { creatorName: newDisplayName, }); });
  • โŒ ์ฐธ๊ณ ๋กœ ์—ฌ๊ธฐ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ๋ช‡ ๋ถ„๋™์•ˆ ์•„์ฃผ ๊ณจ์น˜๋ฅผ ์ฉ์˜€๋‹ค.

    myTweetsQuerySnapshot.forEach((doc) => {
             const myTweetsDocRef = doc(dbService, "tweets", `${doc.id}`);
             batch.update(myTweetsDocRef, {
               creatorName: newDisplayName,
             });
           });

    ์›๋ž˜๋Š” ์œ„ ์ฒ˜๋Ÿผ forEach()์—์„œ ๊ฐ๊ฐ์˜ ๋ฌธ์„œ๋ฅผ ๋ณด๋‚ผ ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์“ฐ๋Š” doc์ด๋ผ๊ณ  ์ ์–ด๋‘์—ˆ์—ˆ๋‹ค.
    ํ•˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ณ„์†์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋œจ๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€...!

    Uncaught (in promise) TypeError: doc is not a function

    ๋„๋Œ€์ฒด doc()์ด ์™œ ํŽ‘์…˜์ด ์•„๋‹ˆ๋ž€ ๋ง์ด์•ผ? ใ… ใ…  ํ•˜๋˜ ๋„์ค‘..์„ค๋งˆ...์ด๋ฆ„์ด ๋˜‘๊ฐ™์•„์„œ ์–˜๊ฐ€ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๊ฑด๊ฐ€ ์‹ถ์–ด์„œ doc์„ tweet์œผ๋กœ ๋ฐ”๊ฟ”๋ดค๋‹ค.

    ํ•˜ํ—ˆํ—ˆํ—›ํ—› ์–ด์ด์—†์–ดใ…Žใ…Ž
    doc์ด๋ผ๊ณ  ์ฃ„๋‹ค ์จ๋†“์œผ๋‹ˆ doc์ด ๋ณด๋‚ด๋Š” arg์ธ์ง€ ํŒŒ์ด์–ด๋ฒ ์ด์Šค fn์ธ์ง€ ์–˜๋„ ํ—ท๊ฐˆ๋ ธ๋‚˜ ๋ณด๋‹ค. ์•ž์œผ๋ก  ์• ์ดˆ์— ์ด๋ฆ„์„ ๋‹ค๋ฅด๊ฒŒ ์ ์„๊นŒ ๋ณด๋‹ค.

  1. ๋ฐฐ์น˜๋ฅผ ์ปค๋ฐ‹ํ•˜์—ฌ ์ผ๊ด„์ ์œผ๋กœ ํ•œ๊บผ๋ฒˆ์— ๋ฌธ์„œ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.
    await batch.commit();

    ์ผ๊ด„ ์“ฐ๊ธฐ๋Š” ์ฝ๊ธฐ ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์‹คํŒจ ์‚ฌ๋ก€๊ฐ€ ์ค„์–ด๋“ ๋‹ค. ์žฌ์‹œ๋„ ๋˜๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์žฌ์‹œ๋„ ์‹คํŒจ์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.


  1. ์ž‘์„ฑํ•œ fn์„ ๋ถ€๋ฅธ๋‹ค.
    updateAllMyTweets();
    ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์ˆ˜์ • ์‹œ ์ž‘์„ฑํ•œ ํŠธ์œ— ์ž‘์„ฑ์ž๋ช…๋„ ๋ฐ”๋€Œ๊ฒŒ ํ•œ๋‹ค.

์ฐธ๊ณ 
๐Ÿ“š Firebase: batched-writes
๐Ÿ“š Firebase: get multiple documents from a collection
๐Ÿ“š Reddit: Can I update multiple docs in collection group in a single update operation
๐Ÿ“š Stackoverflow: Can Firestore update multiple documents matching a condition, using one query?

profile
Always have hope๐Ÿ€ & constant passion๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€