【问题标题】:C# : How to get find out which document was changed when listening to Firestore collectionC#:如何在收听 Firestore 集合时找出更改了哪个文档
【发布时间】:2021-08-10 08:14:57
【问题描述】:

在收听 Firestore 数据库中的集合时,我正在努力获取或找出哪个文档发生了更改。

 Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", certificatePath);
            FirestoreDb db = FirestoreDb.Create("myapp-123");
            CollectionReference collection = db.Collection("customers");
           
            FirestoreChangeListener listener = collection.Listen(snapshot =>
            {
                Console.WriteLine($"Callback received document snapshot");
                Console.WriteLine();
            }); 
            await listener.ListenerTask;

当我对集合中的任何文档进行更改时,它们会按预期检测到,但我不知道如何获取已更改的文档。

我怎样才能找到哪个文档被更改以及获取它的新值?

【问题讨论】:

    标签: c# firebase google-cloud-firestore


    【解决方案1】:

    要找出what document(s) changed between snapshots,请遍历Changes 集合而不是Documents 集合:

    来自链接的文档:

    FirestoreChangeListener listener = query.Listen(snapshot =>
    {
        foreach (DocumentChange change in snapshot.Changes)
        {
            if (change.ChangeType.ToString() == "Added")
            {
                Console.WriteLine("New city: {0}", change.Document.Id);
            }
            else if (change.ChangeType.ToString() == "Modified")
            {
                Console.WriteLine("Modified city: {0}", change.Document.Id);
            }
            else if (change.ChangeType.ToString() == "Removed")
            {
                Console.WriteLine("Removed city: {0}", change.Document.Id);
            }
        }
    });
    

    【讨论】:

      【解决方案2】:

      要了解 Firestore 中哪个文档发生了更改,例如通过其 ID,请使用以下代码行:

      FirestoreDb db = FirestoreDb.Create("myapp-123");
      CollectionReference customersRef = db.Collection("customers");
      
      FirestoreChangeListener listener = customersRef.Listen(snapshot =>
      {
          Console.WriteLine("Customer IDs:");
          foreach (DocumentSnapshot documentSnapshot in snapshot.Documents)
          {
              Console.WriteLine(documentSnapshot.Id);
          }
      });
      

      还请注意,每次查询结果更改时(即添加、删除或更新文档时),快照处理程序都会收到一个新快照。

      编辑:

      根据您的评论:

      它只是打印出所有东西

      这是预期的行为,因为当您附加快照侦听器以实时获取更新时,您会在开始时获取满足相应查询的所有文档。不幸的是,你无法改变它。但是,有一种解决方法,我在以下帖子的回答中对此进行了解释:

      How to skip initial data and trigger only new updates in Firestore Firebase?

      您可以在哪里查看查询快照之间查询结果的实际变化:

      FirestoreDb db = FirestoreDb.Create("myapp-123");
      CollectionReference customersRef = db.Collection("customers");
      FirestoreChangeListener listener = customersRef.Listen(snapshot =>
      {
          foreach (DocumentChange change in snapshot.Changes)
          {
              if (change.ChangeType.ToString() == "Added")
              {
                  Console.WriteLine("New customer: {0}", change.Document.Id);
              }
              else if (change.ChangeType.ToString() == "Modified")
              {
                  Console.WriteLine("Modified customer: {0}", change.Document.Id);
              }
              else if (change.ChangeType.ToString() == "Removed")
              {
                  Console.WriteLine("Removed customer: {0}", change.Document.Id);
              }
          }
      });
      

      但请记住,您不能跳过“已添加”的情况。

      此外,由于每次进行小的更改时它都会打印出所有内容,这是否意味着如果我有 100k 个文档,每当监听器触发时,我将被收取至少 100k 次读取的费用?

      不,它会在您第一次附加侦听器时打印所有内容,而在每次更改时。一旦获得了所有满足查询的文档,您就只能获得满足特定情况的文档。但是,如果您的收藏中有 100k 文档,则首先要附加一个侦听器,您将被收取 100k 读取费用。这就是您应该考虑实施过滤器或分页的原因。

      【讨论】:

      • 我之前确实尝试过,它只是打印出所有内容,没有显示哪个文档发生了变化。此外,由于每次进行小的更改都会打印出所有内容,这是否意味着如果我有 10 万份文档,每当监听器触发时,我将被收取至少 10 万次读取的费用?
      • 不,不喜欢。请参阅我的更新答案。现在清楚了吗?
      • 谢谢大家现在明白了。也许我一定误解了您最初的答案,但我的意思是 Console.WriteLine(documentSnapshot.Id); 行打印出数据库中的每个 id,无论是第一次收听还是后续更改。因此,我无法判断该代码发生了什么变化。
      猜你喜欢
      • 2020-03-17
      • 2018-07-14
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多