【问题标题】:How to fetch the names (a field) of all the documents in a Firestore collection?如何获取 Firestore 集合中所有文档的名称(字段)?
【发布时间】:2019-12-29 14:40:43
【问题描述】:

我正在尝试为我的第一个基本应用程序添加一个不错的功能,该应用程序连接到 Firestore 数据库,获取集合中所有文档的名称并将它们存储在字符串的 ArrayList 中。如下所示,该数据库非常简单,包含一个名为 pedestals 的集合,其中仅包含 3 个文档。每个文档有 4 个字段(jack、jack_laser、name 和 sum): Firestore snapshot of my database

通过使用 pedestals.whereEqualTo("name", true).get() 我猜对所有名称的查询都已初始化,但我不确定如何从中提取名称。我观看了许多 youtube 视频并尝试了 firestore 的 google code-lab 部分,但它们每个都处理查询文档和存储数据 - 虽然在这里我不想获取所有文档,但只获取他们名称字段的值.

以下是相关方法代码:

 private void myFirstQuery2() {
    // Get a reference to the pedestal collection
    final CollectionReference pedestals = mFirestore.collection("pedestals");

    // get all the names of the pedestals in firestore
    pedestals.whereEqualTo("name", true).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            for (QueryDocumentSnapshot document : task.getResult()) {
              //  names.add(document.getString("name"));
                  names.add(document.getData().toString());
            }
            String str = Arrays.toString(names.toArray());
            Log.e(TAG, "god job: " +str);
            Toast.makeText(FileLoading.this, "success!", Toast.LENGTH_LONG).show();
        }//end of onSuccess
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(FileLoading.this, "error!", Toast.LENGTH_LONG).show();
            Log.e(TAG, "could not get the query");
        }
    });
};

如您所见,我尝试实现一个 for 循环,将每个文档快照(即使我正在查找字段而不是文档)存储在一个数组中。

在 logcat 终端中我得到:

08-24 17:41:45.786 10738-10738/benda.leveling_v2 E/MyActivity: 天哪:[]

这让我明白 arraylist 是空的。

我在这里做错了什么?

【问题讨论】:

  • 在 Firestore 中,您始终可以获取整个文档。
  • @ConstantinBeer 不是真的。查询很浅,这意味着您只能获得该级别的文档信息。你没有得到它的子集合。
  • @GauravMall 我说的是文件。子集合是集合。没有说你得到了子集。 Firestore 不会级联。
  • 我们都说了同样的话。我只是误解了你 :) 认为 whole 文件是指整个信息的“楼梯”。
  • 是的,你的权利。它可能会像我写的那样被误解:) 我的错。

标签: java android firebase google-cloud-firestore


【解决方案1】:

虽然在这里我不想获取所有文档,但只想获取其名称字段的值。

您无法从文档中仅获取 name 属性的值。在 Coud Firestore 中,没有字段级权限或对文档的访问。这是整个文档,或者什么都没有。 Firestore 客户端 SDK 始终返回完整的文档。遗憾的是,虽然服务器端 SDK 的 select() 方法中确实存在此选项,但无法使用客户端 SDK 仅请求文档的一部分。

此外,当使用以下代码行时:

pedestals.whereEqualTo("name", true)

这意味着您正在搜索 pedestals 集合中的每个文档,其中属性 name 包含 true 的值。由于该属性包含一个字符串并且 not 一个布尔值,因此没有可以返回的结果。可能的查询是:

pedestals.whereEqualTo("name", "site3")

它将返回您屏幕截图中的第三个文档。如果要获取name属性或文档的id,请使用以下代码行:

pedestals.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                Log.d(TAG, document.getId() + " => " + document.getString("name"));
                Map<String, Object> map = document.getData();
            }
        }
    }
});

如果您想获取这些数组,请注意即使在数据库中这些属性的类型为array,当您获取它们时,对象的类型也是List。另一种解决方案可能是遍历map 并获取相应的值。

【讨论】:

    猜你喜欢
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2011-10-23
    相关资源
    最近更新 更多