【问题标题】:Trying to order Firestore results in query尝试订购 Firestore 会导致查询
【发布时间】:2021-08-25 05:09:47
【问题描述】:

我有一个查询,我想按开始日期排序并按结束日期过滤。

return FirebaseFirestore.instance
        .collection("content")
        .where("active", isEqualTo: true)
        .where("end", isGreaterThanOrEqualTo: DateTime.now())
        .orderBy("start", descending: true)
        .snapshots();

错误:

初始 orderBy() 字段 '[[FieldPath([start]), true]][0][0]' 必须与 where() 字段参数 'FieldPath([end])' 相同时调用不等式运算符。

【问题讨论】:

    标签: flutter google-cloud-firestore


    【解决方案1】:

    如果您包含具有范围比较(、>=)的过滤器,则您的第一个排序必须在同一字段中

    https://firebase.google.com/docs/firestore/query-data/order-limit-data#limitations

    所以你应该去

    return FirebaseFirestore.instance
            .collection("content")
            .where("active", isEqualTo: true)
            .where("end", isGreaterThanOrEqualTo: DateTime.now())
            .orderBy("end", descending: true)
            .orderBy("start", descending:true)
            .snapshots();
    

    【讨论】:

    • 感谢您的回答。因此,如果我希望它们按 start 升序排序……那会怎样?现在他们没有正确订购。我尝试了您的代码并更改了.orderBy("start", descending:false),创建了索引,但仍然没有正确排序。
    • 是的……不工作。尝试了多个 orderBy 但仍然没有在ascending order by start 中订购。
    • 好吧,您应该在where 子句中使用字段start,这样您就可以只使用startorderBy。您可以搜索start <= DateTime.now() && end >= DateTime.now()。猜猜你所有的开始都在结束之前所以你可以orderBy start
    • 这意味着它只会显示开始的事件。我不想那样。我需要显示截至结束日期即将发生的事件。有些事件跨越数天/数周/数月。因此,事件必须在其结束日期之前可见。
    • 好吧,您要么了解如何使用 endstart 参数,以便可以将 start 用作 orderBy 参数,要么将结果保存在列出并扔掉你不需要的东西......
    【解决方案2】:

    您收到以下错误:

    初始 orderBy() 字段 '[[FieldPath([start]), true]][0][0]' 必须与 where() 字段参数 'FieldPath([end])' 相同时调用不等式运算符。

    因为在使用不等式运算符时,如果不先对 end 字段进行排序,就无法从 Firestore 获取数据。因此,您需要在应用程序代码中重新排序结果。所以调用后:

    .where("end", isGreaterThanOrEqualTo: DateTime.now())
    

    必须调用:

    .orderBy("end", descending:false)
    

    所以你的查询应该是这样的:

    return FirebaseFirestore.instance
        .collection("content")
        .where("active", isEqualTo: true)
        .where("end", isGreaterThanOrEqualTo: DateTime.now())
        .orderBy("end", descending:false)
        .orderBy("start", descending:true)
        .snapshots();
    

    不要忘记创建index 以使此查询正常工作。

    【讨论】:

    • 我认为我不能使用ascending,我确实尝试过end - descending falsestart decending true
    • 对不起,我的错,应该是descending:false。使用这种组合的结果是什么?您是否创建了正确的索引?
    • 是的。试过这个组合。但它没有被订购。我会抓住一切,然后在应用程序中订购。目前。我会进一步调查。谢谢。
    • 好的,试一试,告诉我它是否有效。
    • 您是否进一步调查?一切都好吗?
    猜你喜欢
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    相关资源
    最近更新 更多