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

如何使用C#实现Firestore实时更新仅监听新增文档?

Firestore实时监听仅捕获新增文档的解决办法

Firestore的实时监听默认会在首次建立连接时,把集合里所有现有文档都标记为Added返回,这是它的设计逻辑——用来帮你初始化本地数据。但如果只需要监听后续新增的文档,就得过滤掉这次初始同步的内容。

修改后的代码

static void Main(string[] args)
{
    string tempFilePath = Path.GetTempFileName();
    using (FileStream stream = new FileStream(tempFilePath, FileMode.Create))
    {
        byte[] bytes = Properties.Resources.json;
        stream.Write(bytes, 0, bytes.Length);
    }
    Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", tempFilePath);
    FirestoreDb db = FirestoreDb.Create("db");
    Query userQuery = db.Collection("Users");
    
    // 标记是否是首次触发的快照
    bool isFirstSnapshot = true;
    
    FirestoreChangeListener listener = userQuery.Listen(snapshot =>
    {
        if (isFirstSnapshot)
        {
            // 首次快照直接跳过,不处理Added提示
            isFirstSnapshot = false;
            return;
        }
        
        foreach (DocumentChange change in snapshot.Changes)
        {
            switch (change.ChangeType)
            {
                case DocumentChangeType.Added:
                    Console.WriteLine("New user: {0}", change.Document.Id);
                    break;
                case DocumentChangeType.Modified:
                    Console.WriteLine("Modified user: {0}", change.Document.Id);
                    break;
                case DocumentChangeType.Removed:
                    Console.WriteLine("Removed user: {0}", change.Document.Id);
                    break;
            }
        }
    });
    Console.ReadLine();
}

关键说明

  1. 新增isFirstSnapshot布尔变量,用来判断当前快照是否是首次同步的结果,首次触发后就把这个标记设为false,后续只处理增量变更。
  2. 把原来的字符串判断改成switch语句,比ToString()更高效,也避免了字符串匹配可能出现的错误。
  3. 如果需要初始化本地数据,比如把现有文档加载到缓存,可以在isFirstSnapshot为true的分支里做对应的逻辑,之后再跳过新增提示。

内容的提问来源于stack exchange,提问作者Jeff Li

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:33:12