You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 01:35:16