【问题标题】:Android Cloud Firestore document fields queryAndroid Cloud Firestore 文档字段查询
【发布时间】:2021-05-11 12:11:57
【问题描述】:

在下面的示例中,如何从 Cloud Firestore 中查询某个日期 (20210205) 和某个用户 (ala) 的所有时间戳?现在,我可以下载整个文档并在设备上进行过滤。但是效果不好。

FirebaseFirestore db = FirebaseFirestore.getInstance();
    db.collection("companies").document("softnet").collection("users")
            .document("ala").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            Log.d(TAG, "result: " + task.getResult().getData());
        }
    });

【问题讨论】:

  • 您可以在FieldPath.documentId()上查询如下图:stackoverflow.com/a/52252264
  • @FrankvanPuffelen 这无济于事 - 要过滤的数据在文档的字段中。这里的问题是 Firestore 不支持需要使用字段名称子字符串的查询。文档结构将需要更改以支持此要求。字段名称过于具体,无法用于日期级过滤。

标签: java android firebase google-cloud-firestore timestamp


【解决方案1】:

您可以过滤FieldPath.documentId(),如here 所示,以在查询中获取ala 文档。但是正如您自己评论的那样,没有办法使用字段通配符进行过滤。

我能很快想到的最好方法是存储日期数组:

dates: ["20210203", "20210205", "20210207"]

如果您使用arrayUnion 运算符向该数组添加值,您将永远不会得到重复,然后您可以使用array-contains 检查该数组是否包含特定日期。

所以总的来说就是这样(语法错误肯定是可能的):

CollectionRefefence users = db.collection("companies").document("softnet").collection("users");
users
  .whereEqualTo(FieldPath.documentId(), "ala")
  .whereArrayContains("date", "20210207");

老实说,您必须考虑复杂性是否值得,因为仅读取此查询返回的单个文档并检查应用程序代码中的日期字段可能更简单。

【讨论】:

  • 数组的想法最适合我的目的。轻松查找用户和日期的所有时间记录。谢谢!
  • 很高兴听到。 ? 如果可行:请考虑您是否真的需要所有 20210203201512 字段,因为它们(默认情况下)每个都创建一个单独的索引,因此最终可能会随着时间的推移消耗相当多的磁盘空间。
猜你喜欢
  • 2019-08-23
  • 1970-01-01
  • 2019-09-03
  • 2018-12-20
  • 2021-08-12
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
相关资源
最近更新 更多