Firebase Firestore,在另一个文档中获取参考文档

Posted

技术标签:

【中文标题】Firebase Firestore,在另一个文档中获取参考文档【英文标题】:Firebase Firestore, get the reference document inside another document 【发布时间】:2018-06-16 03:57:06 【问题描述】:

我正在使用Firebase Cloud Firestore,我希望在获取包含参考字段的文档时将参考字段作为文档接收,而不是作为对文档的参考...

我有一个用户集合和一个班级集合(在学校),每个班级都包含一个对用户(这个班级的学生)的引用列表。 当我使用document.get()(通过其引用获取类)时,它返回一个包含DocumentReference(用户)列表的对象,所以我需要再调用document.get()大约20次才能让用户成为对象,而不是作为对它们的引用。

我希望能够调用document.get() 一次,它会将所有引用作为文档带给我,如下所示: database 和 code

有没有优雅的方法来做到这一点?

【问题讨论】:

【参考方案1】:

您无法指示 Firestore 客户端 SDK 在提取单个文档期间自动遵循文档引用。您必须请求每个单独的文件。换句话说,在 SQL 中没有您可能期望的“连接”操作。

另请参阅:What is firestore Reference data type good for?

【讨论】:

所以我需要单独请求每个参考?没有其他方法可以做到这一点吗? 这就是我的回答。 我可以使用一些查询功能来获取所有这些引用吗? 您可以单独获取它们。【参考方案2】:

您可以从一个集合中获取多个文档。 Read get mutiple documents section from documentation

这是一个例子

db.collection("classes")
    .document(idOfTheClassYouWantToGet)
    .collection("users")
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>()
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) 
            if (task.isSuccessful()) 
                for (DocumentSnapshot document : task.getResult()) 
                    User user = document.toObject(Users.class);
               
             
        
    );

【讨论】:

在 addOelsenCompleteListener 中你的意思是 addOnCompleteListener?它只会返回一个文档引用列表 是的,你可以通过调用task.getResult()来获取文档。我会编辑我的答案 我觉得你没听懂我的意思,这是我的database now,我想做this之类的事情(代码在kotlin中,但在java中是一样的) 好的,您正在为用户保留路径。这不是一个很好的方法。而是使用 add() 函数将用户写入数据库。它将为每个用户创建一个唯一的 ID。然后将该 id 存储在类集合中。因此,您可以使用它来获取某个类的用户。 @RoiAmiel 如果用户只有一个类,则将用户写入一个类中的子集合

以上是关于Firebase Firestore,在另一个文档中获取参考文档的主要内容,如果未能解决你的问题,请参考以下文章

为啥 firebase_firestore 安全规则不适用于文档读取

Firebase 存储规则在 Firestore 文档上查找数据? [复制]

为啥 Firebase 数据库(Firestore)不添加文档

Firebase Firestore 中一个集合下的文档数量限制

每个文档颤动的 Firebase-firestore 安全规则

firebase Firestore 文档已读取