firebase - 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 语句来检查匹配标题等?
解决方案
您似乎想让 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'
})
}
};
推荐阅读
- javascript - 如何使用 parsimmon.js 解析 jsDoc 注释?
- c++ - 当调用函数中捕获到异常时,如何确保在函数内删除数组?
- python - DJANGO REST FRAMEWORK 中的注册问题
- spring - 在哪个场景中,我们在 applicationContext 上调用 refresh(),start() 和 refresh() 方法有什么区别?
- java - 在androidx中如何正确使用片段?
- javascript - 获取选定文本的锚点名称
- html - 在我的视差页面右侧出现神秘的空白
- xml - 如何将非常复杂的 XML 扁平化为包含根级别所有节点的新 XML
- regex - 引用单元格中的文本并将剩余文本返回到其他单元格
- jquery - jquery触发器没有传递单选按钮值