二阶通过查询在Firestore中不执行任何操作(react-native-firebase)

时间:2018-06-26 01:32:00

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

编辑 因此,在与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)

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

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

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

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

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"
        }
    }
}

(由于复印导致打印质量差)

1 个答案:

答案 0 :(得分:0)

我不确定这是原因,但是在Firebase Realtime数据库中,这是一个常见错误,因此在这里也值得短谈。

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());
相关问题