如何在Firebase Firestore中添加多同名称不同数据的请求且不覆盖
解决Firestore sent_requests覆盖问题,实现多请求存储
你当前的代码中,sent_requests是单一对象结构,使用set(data, SetOptions(merge: true))时会替换整个sent_requests的内容,导致之前的请求被覆盖。要实现添加多个请求,需调整数据结构,以下是几种可行方案:
方案1:使用数组+arrayUnion添加请求
将sent_requests改为数组结构,通过FieldValue.arrayUnion向数组追加新请求,避免覆盖原有内容:
final newRequest = { "sender": loggedInUser.uid, "receiver": args.uid, "details": { "date": detail_class.datetime, "total_dishes": detail_class.total_dishes, "total_people": detail_class.total_people, "meals": detail_class.meals, "location": detail_class.location, } }; final db = FirebaseFirestore.instance; // 用update和arrayUnion添加新请求 await db.collection("users").doc(loggedInUser.uid).update({ "sent_requests": FieldValue.arrayUnion([newRequest]) });
注意:arrayUnion会自动忽略数组中完全相同的对象,若需允许同一发送者向同一接收者发送多次请求,确保每次请求的details包含唯一标识(比如时间戳)即可。
方案2:使用子集合存储请求(推荐)
在用户文档下创建sent_requests子集合,每个请求作为独立文档存储,这种方式更适合大量请求场景,支持单独查询、删除单个请求:
final db = FirebaseFirestore.instance; // 向子集合添加新请求文档,自动生成唯一ID await db.collection("users") .doc(loggedInUser.uid) .collection("sent_requests") .add({ "sender": loggedInUser.uid, "receiver": args.uid, "details": { "date": detail_class.datetime, "total_dishes": detail_class.total_dishes, "total_people": detail_class.total_people, "meals": detail_class.meals, "location": detail_class.location, } });
后续查询已发送请求时,直接查询该子集合即可,还支持分页、过滤等操作。
方案3:使用唯一键对象存储请求
将sent_requests设计为带唯一键的对象,每个请求用唯一ID(比如时间戳)作为键,通过merge: true合并新的键值对,不会覆盖原有请求:
// 生成唯一请求ID,比如当前时间戳 final requestId = DateTime.now().millisecondsSinceEpoch.toString(); final data = { "sent_requests": { requestId: { "sender": loggedInUser.uid, "receiver": args.uid, "details": { "date": detail_class.datetime, "total_dishes": detail_class.total_dishes, "total_people": detail_class.total_people, "meals": detail_class.meals, "location": detail_class.location, } } } }; final db = FirebaseFirestore.instance; await db.collection("users").doc(loggedInUser.uid).set(data, SetOptions(merge: true));
这种方式可以保留所有请求,且能通过唯一键快速定位单个请求进行修改或删除。
内容的提问来源于stack exchange,提问作者Waseem Raza
相关产品推荐
相关产品推荐

