java - Firebase firestore 子集合排序和限制

标签 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 是一个数字时间戳。

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/

相关文章:

android - opencv android,捕获图像

android - 在 Android 上创建约会提醒的最佳方式是什么?

android - Firebase onMessageReceived(RemoteMessage remoteMessage),当应用程序处于后台时不会被调用

ios - Firebase:检索为对象/模型。来自 java

java - Mule 内部生命周期 - 当我们启动 mule 时会发生什么

java - 只有我添加的最终数组列表被克隆到二维数组列表的所有元素。

android - DatePickerDialog软键盘类型无效

swift - 如何使用 Firebase 实时数据库在 tableView 中显示数据

java - 为什么使用计时器删除 View 时应用程序崩溃?

java - Switch 的效率是否值得将其用于嵌套条件而不是 if、else?