Flutter中如何为同一登录用户创建多条Firestore教育记录
问题解答
能否使用同一文档ID?
不行。Firestore里同一个集合下的文档ID是唯一的,你现在用set()方法写入数据,每次都会直接覆盖该ID对应的文档内容,根本存不了多条记录。
替代方案
方案1:用子集合存储单条教育记录
给每个用户创建专属的子集合,每条教育记录作为子集合里的独立文档。这样既能通过用户UID关联所有教育记录,又能避免数据覆盖问题。
修改后的代码示例:
Future CreateEducation(MyEducation educationsss) async { String date1 = selectedMonthStart! + " " + selectedYearStart.toString(); String date2 = selectedMonthEnd! + " " + selectedYearEnd.toString(); final uid = FirebaseAuth.instance.currentUser!.uid; // 为当前用户创建education子集合,自动生成唯一文档ID存储单条记录 final newEducationDoc = FirebaseFirestore.instance .collection("users") // 假设你的用户主集合叫users,用UID作为文档ID .doc(uid) .collection("education") .doc(); // 不指定ID,Firestore自动生成唯一ID final userEducation = MyEducation( uid: uid, universityName: collegeAheadController.text, universityImage: imageuniversitycollege, major: SelectedMajor.toString(), degree: SelectedDegree.toString(), dateEnd: date1, dateStart: date2, ); final json = userEducation.toJson(); await newEducationDoc.set(json); }
方案2:在用户文档中存储教育记录数组
如果教育记录数量不多,可以在用户文档里添加一个数组字段,每次新增记录时用update()方法追加元素。但要注意Firestore单文档有1MB大小限制,数据量较大时不建议用这种方式。
修改后的代码示例:
Future CreateEducation(MyEducation educationsss) async { String date1 = selectedMonthStart! + " " + selectedYearStart.toString(); String date2 = selectedMonthEnd! + " " + selectedYearEnd.toString(); final uid = FirebaseAuth.instance.currentUser!.uid; final userDoc = FirebaseFirestore.instance .collection("users") // 用户主集合 .doc(uid); final userEducation = MyEducation( uid: uid, universityName: collegeAheadController.text, universityImage: imageuniversitycollege, major: SelectedMajor.toString(), degree: SelectedDegree.toString(), dateEnd: date1, dateStart: date2, ); final json = userEducation.toJson(); // 用arrayUnion追加新记录,自动去重;不需要去重的话直接拼接数组即可 await userDoc.update({ "education": FieldValue.arrayUnion([json]) }); }
方案选择建议
- 若需要单独对某条教育记录执行增删改查操作,优先选子集合方案,灵活性更高。
- 若教育记录数量少、结构简单,且无需单独操作单条记录,可选择数组存储方案,查询更便捷。
内容的提问来源于stack exchange,提问作者Jessen Jie
相关产品推荐
相关产品推荐

