Firebase firestore子集合的排序和限制

时间:2018-05-30 06:04:54

标签: java android firebase google-cloud-firestore

我有一个路径为/coll_A/document_A/coll_B的子集合,其中coll_A / _B - 是集合。我想通过排序和限制来查询这个子集合:

firestore.collection("coll_A")
        .document("document_A")
        .collection("coll_B")
        .orderBy("time", DESCENDING)
        .limit(10)
        .get()
        .addOnCompleteListener(...)

但它总是返回完整的集合。我做错了什么?

time是一个数字时间戳。

更新time只是一个例子,之前我使用过整数字段。根据Alex Mamo的回答,它应该可以通过它来订购。

UPD。 2 我试图准备一个截图并删除并重新添加数据 - 它开始起作用了。数据也是一样的,集合-doc-collection层次结构也是如此,所以可能是某种故障。

1 个答案:

答案 0 :(得分:2)

要解决此问题,您的日期应存储为 here 所解释的Date对象,而不是您所说的数字。因此,要解决此问题,请将您的查询更改为:

firestore.collection("coll_A")
    .document("document_A")
    .collection("coll_B")
    .orderBy("date", Query.Direction.DESCENDING)
    .limit(10)
    .get()
    .addOnCompleteListener(...)

根据Firestore Supported Data Types文档,您可以按日期和时间对记录 chronological 进行排序。使用Firebase Realtime数据库时,将日期和时间保存为 ServerValue.TIMESTAMP 非常有用。在新的Cloud Firestore中,您需要将日期存储为Date对象,以便能够根据它对记录进行排序。请参阅此处有关ServerTimestamp的信息:

  

用于标记要使用服务器时间戳填充的时间戳字段的注释。如果正在编写的POJO对于@ ServerTimestamp-annotated字段包含null,则它将替换为服务器生成的时间戳。

因此,这是您实现目标的正确方法。

如果您有兴趣,可以 this 了解如何在需要时更新日期。

修改

您可以按整数或字符串排序,但请记住:按字符串排序时,请记住date在按chronological order排序时,您将获得whereEqualTo()

使用strings are ordered lexicographically设置Cloud Firestore字段所产生的对象是FieldValue.serverTimestamp()的实例。当您稍后阅读该值时,您可以使用java.util.Date获取纪元时间。这就是为什么Firebase团队添加了这种新支持的数据类型,这比存储为数字的常规数据更有用。

如果您想要更多限制来改善查询,还可以使用whereGreaterThan()whereGreaterThanOrEqualTo()whereLessThan()whereLessThanOrEqualTo()Date

总之,存储日期的最佳方法是将其存储为{{1}}个对象。