如何从Firebase Firestore实时更新文档中获取修改后的字段或数据?

Gow*_*n M 3 java android firebase google-cloud-firestore

我有多个文档。我的问题是我无法获取修改的特定数据,我正在获取完整的文档。

 db.collection("employees").whereEqualTo("OID", OID)
                    .addSnapshotListener(new EventListener<QuerySnapshot>() {
                        @Override
                        public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {

                if (e != null) {
                    Log.w(TAG, "listen:error", e);
                    return;
                }

                for (DocumentChange dc : snapshots.getDocumentChanges()) {
                    switch (dc.getType()) {
                        case ADDED:
                             //Here i am getting full newly added documents
                            break;
                        case MODIFIED:
                           //here i am getting which is modified document,ok fine...,But i want to get only the filed which i modified instance of getting full documents..
                            break;
                        case REMOVED:

                            break;
                    }
                }

            }
        });
Run Code Online (Sandbox Code Playgroud)

笔记:

案例已修改:这里我得到的是完整文档的修改版本,效果很好。但我只想获取我修改的字段,而不是获取文档中的所有字段。

在此输入图像描述

看看上面的截图

例如

如果我将字段isActive=true更改为isActive=fals e 那么我只想获取特定的字段。,, 我不想要其余的所有字段...(或)如何识别哪个字段已更改。

Ale*_*amo 5

如何判断哪个字段发生了变化?

您无法在 Cloud Firestore 中实现此目的。新的 Cloud Firestore 数据库与 Firebase 实时数据库具有不同的概念,不应混淆。没有字段级权限或对文档的访问权限。它是整个文档,或者什么也没有。

因此,如果您想将该字段更改isActive=trueisActive=false,那么您将在修改后获得整个文档,而不是您已更改的属性。

Cloud Firestore 侦听器在文档级别触发。无法仅通过文档中的特定字段来触发。因此 Firestore 客户端 SDK 始终返回完整的文档。不幸的是,客户端 SDK 无法仅请求文档的一部分,尽管服务器端 SDK 的select()中确实存在此选项方法中确实存在此选项,但客户端 SDK 无法仅请求文档的一部分。

如果您只想收到特定字段的通知,请考虑添加一个额外的集合,其中包含仅包含这些字段的文档。因此,创建附加集合,其中每个文档仅包含您需要的数据。这还有一个好处,因为还可以让您更轻松地安全地访问不同类型的数据。为此,请参阅 Gil Gilbert 的回答:

托德·克佩尔曼的回答来自:

这种数据重复在 Firestore 等 NoSQL 解决方案中非常常见,为此,我建议您观看此视频,非规范化在 Firebase 数据库中很常见,以便更好地理解。它适用于 Firebase 实时数据库,但相同的原则也适用于 Cloud Firestore。