我有一个路径为 /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
是一个数字时间戳。
Upd.: time
只是一个例子,我之前用的是整型字段。根据 Alex Mamo 的回答,它应该可以通过它订购。
更新。 2 我试着准备了一个屏幕截图并删除并重新添加了数据 - 它开始起作用了。数据都是一样的,collection-doc-collection 层次结构也是,所以可能是某种小故障。
最佳答案
要解决此问题,您的日期应存储为 Date
对象,如 here 所述 而不是你说的那么多。因此,要解决此问题,请将您的查询更改为:
firestore.collection("coll_A")
.document("document_A")
.collection("coll_B")
.orderBy("date", Query.Direction.DESCENDING)
.limit(10)
.get()
.addOnCompleteListener(...)
根据 Firestore Supported Data Types文档,您可以按日期和时间对记录进行时间
排序。将日期和时间保存为 ServerValue.TIMESTAMP 在使用 Firebase 实时数据库时很有用。在新的 Cloud Firestore 中,您需要将日期存储为 Date
对象,以便能够根据它对记录进行排序。另请参阅此处有关 ServerTimestamp 的信息:
Annotation used to mark a timestamp field to be populated with a server timestamp. If a POJO being written contains null for a @ServerTimestamp-annotated field, it will be replaced with a server-generated timestamp.
所以这是您实现目标的正确方法。
如果您有兴趣, this 是您可以在需要时更新日期的方法。
编辑:
您可以按整数或字符串排序,但请记住:按字符串排序时请记住 strings are ordered lexicographically在按日期
订购时,您会得到一个时间顺序
。
通过使用 FieldValue.serverTimestamp() 设置 Cloud Firestore 字段产生的对象是 java.util.Date 的实例.当您稍后读取该值时,您可以使用 getTime() 获取纪元时间.这就是 Firebase 团队添加这种新的受支持数据类型的原因,它比存储为数字的常规数据更有用。
如果你想用更多的限制来改进你的查询,你也可以使用 whereEqualTo()
, whereGreaterThan()
, whereGreaterThanOrEqualTo()
, whereLessThan()
或 whereLessThanOrEqualTo()
。
总而言之,存储日期的最佳方式是将其存储为 Date
对象。
关于java - Firebase firestore 子集合排序和限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50597378/