如何将Firestore文档ID同时作为属性存入文档而非仅作为集合引用?
解决方案:直接将Firestore文档ID存入属性(无需先存再更新)
当然可以一步到位实现你的需求,不用先保存再更新文档!核心思路是提前自己生成文档ID,然后在创建文档时把这个ID直接写入到文档的属性中,这样就避免了二次更新的操作。
推荐实现方式:自定义文档ID并一步创建
AngularFirestore提供了createId()方法,可以生成和Firestore自动生成规则一致的ID。你只需要把这个ID加到你的set对象里,再用set()方法指定ID创建文档即可:
// 1. 生成符合Firestore规则的文档ID const setId = this.AngularFirestore.createId(); // 2. 把ID添加到你的set对象中(假设你的SetModel包含id属性) const setWithId = { ...this.set, id: setId }; // 3. 用指定ID的方式创建文档,同时写入包含ID的对象 newSet.collection('sets').doc(setId).set(setWithId) .then(() => { console.log('文档创建成功,ID已同步存入属性'); }) .catch(error => { console.error('创建文档出错:', error); });
如果你坚持用add()方法(两步操作)
如果一定要用Firestore自动生成ID的add()方法,那确实需要先创建文档拿到ID,再执行更新操作,代码示例如下:
newSet.collection('sets').add(this.set) .then(docRef => { // 获取自动生成的ID,更新文档添加id属性 return docRef.update({ id: docRef.id }); }) .then(() => { console.log('文档创建完成,已成功添加ID属性'); }) .catch(error => { console.error('操作失败:', error); });
两种方式对比
- 第一种自定义ID的方式是一步操作,没有额外的网络请求,效率更高,也不用担心创建成功但更新失败的不一致问题,更推荐使用。
- 第二种add+update的方式是两步操作,适合你完全依赖Firestore自动生成ID的场景,但要注意如果更新步骤失败,会出现文档没有ID属性的情况,需要做好异常处理。
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

