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

时间:2018-09-12 12:34:57

标签: 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;
                    }
                }

            }
        });

注意:

案例修改:在这里,我得到的是对完整文档的修改,可以正常工作。但是我只想获取修改后的字段,而不是从文档中获取所有字段。

enter image description here

看看上面的屏幕截图

例如

如果我将字段 isActive = true 更改为 isActive = fals e,那么我只想获取特定的文件。,我不希望剩下的全部字段...(或)如何识别要更改的字段。

1 个答案:

答案 0 :(得分:2)

  

如何识别更改了哪个字段?

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

因此,如果您想将字段isActive=true更改为isActive=false,则修改后将获得整个文档,而仅显示您已更改的属性

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

如果只想通知特定字段,请考虑为仅包含这些字段的文档添加额外的集合。因此,请创建该附加集合,其中每个文档仅包含您需要的数据。这也有一个好处,因为这还将使您能够更轻松地保护对不同类型数据的访问。为此,请参见Gil Gilbert的回答:

Todd Kerpelman的回答来自:

这种数据重复在诸如Firestore之类的NoSQL解决方案中非常普遍,为此,我建议您观看此视频Denormalization is normal with the Firebase Database,以更好地理解。它用于Firebase实时数据库,但与Cloud Firestore的原理相同。