【问题标题】:Second orderBy query does nothing in Firestore (react-native-firebase)第二 orderBy 查询在 Firestore 中没有任何作用(react-native-firebase)
【发布时间】:2018-12-04 15:15:23
【问题描述】:

编辑 因此,在与 firebase 开发人员审查了这个问题之后,这是按设计工作的,没有实际的方法可以实现这一点。 Firestore 开发人员的官方回应:

诚然,某些类型的查询很困难,如果不可行的话, 使用 Firestore 的 NoSQL 设计时。如果缺乏这样的 能力被认为是您的用例的交易破坏者,那么它是 Firestore 可能不是适合您的数据库解决方案。

如果您渴望实现类似的目标,那么此解决方案可能对您有用:https://firebase.google.com/docs/firestore/solutions/arrays#solution_a_map_of_values

如果没有,总是有 AWS

================================================ ==============================

我注意到第二个orderBy 查询选项对返回的数据没有任何作用。 考虑以下查询:

firebase.firestore()
  .collection('posts')
  .orderBy('date', 'desc')
  .where('date', '>', new Date(1529802276644))
  .orderBy('rating', 'desc')
  .limit(size)

此查询打算按date 字段排序posts,然后过滤最后两天,然后按rating 排序。

此查询目前在两天内返回 3 个帖子,但未按评级排序。我收到的结果是:

[
  {date: 3 hours ago, rating: 1},
  {date: 5 hours ago, rating: -1},
  {date: 9 hours ago, rating: 0},
]

如果我在删除最后一个 orderBy 的情况下执行相同的查询,我实际上会得到完全相同的结果:

firebase.firestore()
  .collection('posts')
  .orderBy('date', 'desc')
  .where('date', '>', new Date(1529802276644))
  .limit(size)

产生:

[
  {date: 3 hours ago, rating: 1},
  {date: 5 hours ago, rating: -1},
  {date: 9 hours ago, rating: 0},
]

我目前对帖子启用了索引。我相当确定该索引是正确的,因为在此之前我收到一个关于缺少索引的错误,然后用这个索引修复它:

posts |  date DESC rating DESC   |    enabled

我很确定问题出在 firebase 而不是我正在使用 react-native-firebase 的库。我使用的 firebase firestore SDK 在 5.0.4 我相信

编辑 以下是我在 react-native 项目中实际使用代码的方式:

const episodeRef = firebase.firestore().collection('posts');
const baseRequest = episodeRef.orderBy('date', 'desc').where('date', '>', new Date(1529802276644)).orderBy('rating', 'desc').limit(25)
const documentSnapshots = await baseRequest.get()
console.log('documentSnapshots', documentSnapshots);

console.log 打印出有效的查询快照,_query 字段大致如下:

_fieldFilters:{
    fieldPath:{
        string:"date",
        type:"string"
    },
    operator:"GREATER_THAN",
    value:{
        type:"date",
        value:1529802276644
    },
}
_fieldOrders:{
    0:{
        direction:"DESCENDING",
        fieldPath: {
            string:"date",
            type:"string"
        },
    }
    1:{
        direction:"DESCENDING"
        fieldPath:{
            string:"rating",
            type:"string"
        }
    }
}

(由于复印导致打印不良)

【问题讨论】:

  • 如果您确定存在错误,请提交错误报告:firebase.google.com/support/contact/bugs-features
  • @DougStevenson,我不确定这是一个错误,只是在寻找关于我可能做错什么的建议。不过感谢您的链接,一旦确定,我会发送报告!
  • 好的,你说“很确定问题出在 Firebase 上”。如果你有复现步骤,提交错误报告并没有错。
  • 请编辑您的问题以包括您实际观察/处理数据的方式。简单的console.log() 很好,但没有它我们无法知道问题是否源于此类代码。
  • 虽然 Frank van Puffelen 和 Doug Stevenson 试图帮助您,但我不适合说些什么,但您是否尝试过任何其他组合来更好地理解问题?就像删除 where 子句或更改操作顺序(如 orderby -> orderby -> wherewhere -> orderby -> orderby 或只进行评级顺序)

标签: javascript firebase react-native google-cloud-firestore react-native-firebase


【解决方案1】:

我不确定这是不是这个原因,但在 Firebase 实时数据库中这是一个常见错误,所以在这里也值得一提。

当您将QuerySnapshot documentSnapshots 转换为字符串时,它会丢失有关数据顺序的任何信息。

而是使用QuerySnapshot.forEach() 循环遍历结果,以确保您保持请求数据的顺序:

const documentSnapshots = await baseRequest.get()
documentSnapshots.forEach(document => {
  console.log('document', document);
});

如果可行,这可能也可行:

const documentSnapshots = await baseRequest.get()
console.log('document', documentSnapshots.docs());

【讨论】:

  • 同样的结果,返回的顺序确实是1, -1, 0。我相信这是 firebase 的预期排序,因为第一个 date orderBy 优先于 rating orderBy。这很公平但很遗憾,因为我认为我不能先订购rating,然后再按date 过滤,因为这里底部描述了这个firestore 查询限制:firebase.google.com/docs/firestore/query-data/queries
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 2021-10-24
  • 2018-11-10
  • 1970-01-01
  • 2019-04-20
相关资源
最近更新 更多