我有一个路径为/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层次结构也是如此,所以可能是某种故障。
答案 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}}个对象。