【问题标题】:Firebase firestore subcollection ordering and limitFirebase Firestore 子集合排序和限制
【发布时间】:2018-11-08 21:03:56
【问题描述】:

我有一个路径为/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 的回答,应该可以通过它订购。

更新。 2我尝试准备一个屏幕截图并删除并重新添加数据 - 它开始工作。数据都是一样的,collection-doc-collection 层次结构也是一样的,所以可能是某种故障。

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    要解决这个问题,您的日期应该存储为 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 文档,您可以按日期和时间对您的记录chronological 进行排序。在使用 Firebase 实时数据库时,将日期和时间保存为 ServerValue.TIMESTAMP 非常有用。在新的 Cloud Firestore 中,您需要将日期存储为 Date 对象,以便能够根据它对记录进行排序。另请参阅此处有关ServerTimestamp 的信息:

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

    所以这是实现你想要的东西的正确方法。

    如果您有兴趣,this 是您在需要时更新日期的方法。

    编辑:

    您可以按整数或字符串排序,但请记住:按字符串排序时,请记住strings are ordered lexicographically,而按date 排序时,您将得到chronological order

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

    如果您想通过更多限制改进您的查询,您也可以使用whereEqualTo()whereGreaterThan()whereGreaterThanOrEqualTo()whereLessThan()whereLessThanOrEqualTo()

    作为结论,存储日期的最佳方式是将其存储为 Date 对象。

    【讨论】:

    • 但是我不想要一个日期,它应该是可排序的,并且可以通过数字来限制
    • 我仍然不关注 - 我不能按整数、字符串等进行排序和限制?
    • 感谢更新,问题是它不起作用。我知道并期望按字典顺序对字符串进行排序,并且我期望对整数进行开箱即用的排序。帖子中的时间也只是一个数字,应该是可排序的/可限制的
    • 请添加您的数据库结构的屏幕截图。除了orderBylimit 之外,您在查询中是否使用了任何其他限制?
    • 请查看我的更新 - 它突然开始工作,我认为我应该接受您的回答,因为它可以很好地回答订购方式。
    猜你喜欢
    • 2020-08-19
    • 2019-09-26
    • 2018-08-19
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    相关资源
    最近更新 更多