首页 > 解决方案 > Firestore - 添加其他文档而不创建副本

问题描述

我创建了一个函数,它将向用户添加“成就”,如下所示:

  const GiveAchievementTest = async () => {
    const achievements = firestore.collection("users").doc(user.uid).collection("achievements");
    const snapshot = await achievements.get();
    if (!snapshot.exists) {
      try {
        await achievements.add({
          title: 'Test Achievement',
          reward: 200,
          desc: 'Testing Function'
        });
        console.log('Gave Achievement');
      } catch (error) {
        console.log('Error in creating giving achievement to user', error);
      }
    }        
  }

通读firebase文档:https ://firebase.google.com/docs/firestore/manage-data/add-data - 他们似乎没有提到如何处理不创建相同成就的副本,因为目前它是自动的- 为文档生成一个 id。

如何解决这个问题?我是否需要设置一个 ID 以使其无法创建另一个 ID,或者您是否会运行一个 if 语句来检查匹配标题等?

标签: firebasereact-nativegoogle-cloud-firestore

解决方案


您似乎想让 Title 在用户集合的成就子集合中唯一。如果是这样,你可以这样做。

const GiveAchievementTest = async () => {
    const title = "Test Achievement"
    const achievements = firestore.collection('users').doc(user.uid).collection('achievements').where('title','==', title);
    const snapshot = await achievements.get();
    if(snapshot.size > 0){
        snapshot.forEach(achievementDoc=>{
            const achievementId = achievementDoc.id;
            /// update data here 
            // firestore.collection('users').doc(user.uid).collection('achievements').doc(achievementId).update({...update data here...})
            /// or add new fields with merging existing data 
            // firestore.collection('users').doc(user.uid).collection('achievements').doc(achievementId).set({...new data here...},{merge: true})
        })
    }else {
        await firestore
          .collection('users')
          .doc(user.uid)
          .collection('achievements')
          .add({
              title: title,
              reward: 200,
              desc: 'Testing Function'
          })
    }
};

推荐阅读