【问题标题】:Iterate through sub collections to get fields - Firestore Android遍历子集合以获取字段 -​​ Firestore Android
【发布时间】:2018-09-03 18:04:09
【问题描述】:

每个Notification ID 集合只包含一个文档,我想迭代ToseefShop1 中的所有集合并获取相应的文档名称和字段数据。

数据模型:

子集合:

代码:

dbRef.collection("Shop Notifications")
        .document("ToseefShop1")
        .get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
    @Override
    public void onSuccess(QuerySnapshot querySnapshot) {
        // Dont know what to do
    }
});

这不是一个重复的问题。另一个问题(有人建议重复)是关于 javascript 的,答案是针对 Node.js 的。没有接受任何答案。事实上,我在 firestore Java 中找不到 getcollections() 方法。

【问题讨论】:

  • 子集合的名称是否总是相同的,即'Notification ID:0'和Notification ID:1'?
  • 不,它们每次都会不同。
  • Doug Stevenson 指出(通过将问题标记为重复)没有办法(使用 Android/iOS/JavaScript SDK)获取文档的(子)集合列表。您必须知道集合的标识符才能访问它们。一种解决方法是在父文档中维护子集合标识符的列表(例如,作为数组类型的字段)。
  • 晚了,但如果你愿意在 Firebase RealTimeDb 中这样做,你会毁掉它;-)

标签: java android firebase google-cloud-firestore


【解决方案1】:

Firestore 中无法查询文档以获取其下的子集合。为了获得您要求的文档名称和字段数据,首先您需要获得子集合的名称,然后在参考中使用它们。如果您只有 2 个子集合,建议您使用以下代码:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query firstQuery = rootRef
    .collection("Shop Notifications")
    .document("ToseefShop1")
    .collection("Notification ID:0");
Query secondQuery = rootRef
    .collection("Shop Notifications")
    .document("ToseefShop1")
    .collection("Notification ID:1");

Task firstTask = firstQuery.get();
Task secondTask = secondQuery.get();

Task combinedTask = Tasks.whenAllSuccess(firstTask, secondTask).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
    @Override
    public void onSuccess(List<Object> list) {
         //Do what you need to do with your list
    }
});

【讨论】:

  • 我想我必须重新考虑我想要的架构设计。谢谢回复:)
  • 这是唯一的方法吗?如果我们有很多子集合怎么办??
  • @user3410835 如果你有两个以上的集合,你应该使用然后传递一个任务对象列表,正如我在这个 this post 的回答中所解释的那样。
  • 所以要有子集合,我们需要在顶级集合中有一个数组字段,并且这个数组字段应该有对子集合的文档引用,对吗??使用数组字段的问题是一旦我们创建了数组,以后我们就不能再向数组添加项目了。一旦创建了数组,它的大小就固定了。所以我们以后不能添加更多的子集合。为了解决这个问题,我为每个子集合创建一个字段,该字段将存储相应子集合的名称。这是正确的方法吗??
  • @user3410835 恐怕我不明白你的问题。我建议您使用自己的 MCVE 发布一个新问题,以便我和其他 Firebase 开发人员可以帮助您。
【解决方案2】:

无法(使用 Android/iOS/JavaScript SDK)获取文档的(子)集合列表。您必须知道集合的标识符才能访问它们。

从附加到问题的 cmets 中,我了解到每个文档的子集合标识符会有所不同(也可能是它们的编号)。因此,一种解决方法可能是在父文档中维护子集合标识符的列表(例如,作为数组类型的字段)。

【讨论】:

  • 我想我必须重新考虑我想要的架构设计。谢谢回复:)
【解决方案3】:

您可以使用云函数列出给定文档的所有子集合。

Read Approach #2: Use a Cloud Function

在页面中间。

方法 #1:将列表保存在父文档的专用字段中

与此处的其他答案非常相似,但您可能希望 second 方法比 first 方法更多,因为第二种方法更有效,更有生产力,更便宜,并且您的数据库比第一种方法更容易维护。

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多