如何使用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(); }
关键说明
- 新增
isFirstSnapshot布尔变量,用来判断当前快照是否是首次同步的结果,首次触发后就把这个标记设为false,后续只处理增量变更。 - 把原来的字符串判断改成
switch语句,比ToString()更高效,也避免了字符串匹配可能出现的错误。 - 如果需要初始化本地数据,比如把现有文档加载到缓存,可以在
isFirstSnapshot为true的分支里做对应的逻辑,之后再跳过新增提示。
内容的提问来源于stack exchange,提问作者Jeff Li
相关产品推荐
相关产品推荐

